2013-04-04 91 views
1

我已阅读如何使用每场分析器包装,但无法让它与我的自定义分析器一起工作。我甚至无法让分析器运行构造函数,这让我相信我实际上错误地调用了每场分析器。Lucene.net PerFieldAnalyzerWrapper

下面是我在做什么:

创建每场分析:

PerFieldAnalyzerWrapper perFieldAnalyzer = new PerFieldAnalyzerWrapper(srchInfo.GetAnalyzer(true)); 
perFieldAnalyzer.AddAnalyzer("<special field>", dta); 

所有字段添加文件做像往常一样,包括我们分析不同的特殊领域。

而且使用分析仪这样的添加文件:

iw.AddDocument(doc, perFieldAnalyzer); 

我在正确的轨道上?

+0

假设你正在使用Lucene 3.x中,看起来没事,给我。是否抛出异常?究竟是什么问题? – femtoRgon 2013-04-04 21:13:48

回答

1

的问题是有关我的的CMS(Kentico)的依赖内置的Lucene的辅助类。基本上,使用这些类需要通过CMS在索引级指定自定义分析器,我不希望这样做。所以我最终直接使用Lucene.net几乎在任何地方都可以获得使用任何自定义分析器的灵活性

我还对结构数据做了一些更改,并最终使用经过验证的KeywordAnalyzer分析文档标签。以前我试图在逗号分隔值上做一些自定义标记化魔术,比如[tag1,tag2,带有很多部分的标签],并且不能可靠地使用多部分标签。我仍然保留该字段,但开始在文档中添加多个“标签”字段,每个字段存储一个标签。所以现在我有N个“标签”字段用于“N”标签,每个标签都被分析为一个关键字,这意味着每个标签(一个字或多个标签)都是一个标签。

我想我用我最初的方法推翻了它。

这就是我最终的结果。

在索引:

KeywordAnalyzer ka = new KeywordAnalyzer(); 
PerFieldAnalyzerWrapper perFieldAnalyzer = new PerFieldAnalyzerWrapper(srchInfo.GetAnalyzer(true)); 
perFieldAnalyzer.AddAnalyzer("documenttags_t", ka); 

-- Some procedure to compile all documents by reading from DB and putting into Lucene docs 

foreach(var doc in docs) 
{ 
    iw.AddDocument(doc, perFieldAnalyzer); 
} 

在搜索:

KeywordAnalyzer ka = new KeywordAnalyzer(); 
PerFieldAnalyzerWrapper perFieldAnalyzer = new PerFieldAnalyzerWrapper(srchInfo.GetAnalyzer(true)); 
perFieldAnalyzer.AddAnalyzer("documenttags_t", ka); 

string baseQuery = "documenttags_t:\"" + tagName + "\""; 
Query query = _parser.Parse(baseQuery); 
var results = _searcher.Search(query, sortBy)