2

我已经阅读了如何使用每个字段分析器包装器,但无法让它与我的自定义分析器一起使用。我什至无法让分析器运行构造函数,这让我相信我实际上错误地调用了每个字段分析器。

这就是我正在做的事情:

创建每个字段分析器:

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

像往常一样添加所有字段做文档,包括我们以不同方式分析的特殊字段。

并像这样使用分析器添加文档:

iw.AddDocument(doc, perFieldAnalyzer);

我在正确的轨道上吗?

4

1 回答 1

1

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

我还对数据结构进行了一些更改,最终使用了久经考验的 KeywordAnalyzer 来分析文档标签。以前我试图对逗号分隔的值(如 [tag1, tag2, tag with many parts] 做一些自定义标记化魔术,但无法使其可靠地与多部分标签一起使用。我仍然保留该字段,但开始在文档中添加多个“标签”字段,每个字段都存储一个标签。所以现在我有“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)
于 2013-04-05T18:26:43.180 回答