在Lucene 4.4.0中搜索词干和确切词

时间:2013-10-03 16:53:46

标签: java lucene indexing stemming

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

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

受阻和未受干扰的文字需要不同的分析策略,因此您需要为Analyzer提供不同的QueryParser。 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);

如果真的想要,我可以看到实现它的几种可能性。

一种方法是创建自己的干式过滤器,基于(或可能扩展)您希望使用的过滤器,并添加在阻塞后保留原始标记的功能。在这种情况下,请注意您的位置增量。短语查询等可能存在问题。

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

但是,这些都是糟糕的想法。对于仅仅索引两个字段的更容易和更有用的方法,我认为这两种策略都没有任何好处。