我存储了一个 lucene 文档,其中一个 TextField 包含没有词干的单词。
我需要实现一个搜索程序,允许用户搜索单词和确切的单词, 但如果我存储的单词没有词干,则无法进行词干搜索。 有一种方法可以在文档中搜索确切的单词和/或词干单词,而无需 存储两个字段?
提前致谢。
最佳答案
对两个单独的字段建立索引对我来说似乎是正确的方法。
词干文本和非词干文本需要不同的分析策略,因此需要您为 QueryParser
提供不同的 Analyzer
。 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);
<小时/>
如果您真的想要的话,我可以看到几种实现它的可能性。
一种方法是基于(或可能扩展)您希望使用的过滤器创建您自己的词干过滤器,并添加在词干提取后保留原始标记的功能。在这种情况下,请注意你的位置增量。短语查询等可能会出现问题。
另一种(可能更糟糕)的可能性是正常将文本添加到字段,然后再次将其添加到同一字段,但这次是在手动词干之后。添加的两个同名字段将被有效连接。在这种情况下,您希望存储在单独的字段中。期待不稳定的得分。
不过,这两个都是坏主意。我认为与仅对两个字段建立索引这一更简单、更有用的方法相比,这些策略没有任何好处。
关于java - 在 Lucene 4.4.0 中搜索词干和精确词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19164879/