java - 在 Lucene 4.4.0 中搜索词干和精确词

标签 java lucene indexing stemming

我存储了一个 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/

相关文章:

python - Geopandas 数据框到 GeoJSON 到 Elasticsearch 索引?

java - 网址响应时间

java - 如何将 ImageIcon 转换为图像?

java - 在 DynamoDB 中自动填充 Epoch 格式的时间

java - 在 Lucene 中使用不同的相似性获得相同的结果

java - 使用 SolrIndexSearcher 进行 ids 查询

java - 我可以向 JAX-RS 方法添加自定义注释以验证访问吗?

performance - 如何过滤掉indexsearcher.search()函数返回的 "Hits"结果?

sql-server - SQL Server 索引类型有哪些?

seo - googlebot 会在索引我的网站之前运行我的 php 代码吗?