1

我存储了一个带有单个 TextField 的 lucene 文档,其中包含没有词干的单词。

我需要实现一个允许用户搜索单词和确切单词的搜索程序,但如果我存储的单词没有词干,则无法进行词干搜索。有一种方法可以在没有存储两个字段的情况下在 Documents 中搜索确切的单词和/或词干单词?

提前致谢。

4

1 回答 1

2

索引两个单独的字段对我来说似乎是正确的方法。

词干和非词干文本需要不同的分析策略,因此需要您提供不同AnalyzerQueryParser. Lucene 并不真正支持使用不同的分析器在同一字段中索引文本。这是设计使然。此外,在同一字段中复制文本可能会导致一些相当奇怪的评分影响(尤其是词干分析器未触及的术语的评分较高)。

无需将文本存储在每个字段中,但仅将它们索引到单独的字段中才有意义。

顺便说一句,您可以使用 , 将不同的分析器应用于不同的字段PerFieldAnalyzerWrapper。像:

Map<String,Analyzer> analyzerList = new HashMap<String,Analyzer>();
analyzerList.put("stemmedText", new EnglishAnalyzer(Version.LUCENE_44));
analyzerList.put("unstemmedText", new StandardAnalyzer(Version.LUCENE_44));
PerFieldAnalyzerWrapper analyzer = new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_44), analyzerList);

不过,如果您真的愿意,我可以看到几种实现它的可能性。

一种是创建自己的词干过滤器,基于(或可能扩展)您已经希望使用的词干过滤器,并添加在词干提取后保留原始标记的能力。在这种情况下,请注意您的职位增量。短语查询等可能有问题。

另一种(可能更糟)的可能性是将文本正常添加到字段中,然后再次将其添加到同一字段中,但这一次是在手动词干之后。添加的具有相同名称的两个字段将被有效连接。在这种情况下,您希望存储在单独的字段中。期待不稳定的得分。

不过,这两个都是坏主意。我认为这些策略中的任何一个都比仅索引两个字段的更简单和更有用的方法有任何好处。

于 2013-10-03T22:32:36.497 回答