Lucene 不会搜索带有“_”的文本

本文关键字:文本 搜索 Lucene | 更新日期: 2023-09-27 18:09:28

可能的重复项:
Lucene 搜索和下划线

我正在使用 Lucene 全文搜索在我的应用程序中进行搜索。

但是例如,如果我搜索"Turbo_Boost",它将返回 0 个结果。

对于其他文本,它可以正常工作。

知道吗?

Lucene 不会搜索带有“_”的文本

假设你使用的是StandardTokenizer,它将在下划线字符上拆分。

您可以通过提供自己的Tokenizer来解决此问题,该下划线将保留在返回的Token中(通过Filter实例或TokenFilter实例的组合(。

Lucene 的一般经验法则是使用用于索引数据的相同标记器/分析器对搜索查询进行标记化。

请参阅 http://wiki.apache.org/lucene-java/LuceneFAQ#Why_is_it_important_to_use_the_same_analyzer_type_during_indexing_and_search.3F

我只能想到查询失败的几个原因:

首先,也可能是最不可能的,考虑到其他文本搜索正常,您没有设置要分析的文档字段。 它不会被标记化,因此您只能搜索整个字段的确切值。 同样,这可能不是您的问题。

第二个(与第三个相关(很可能取决于您执行搜索的方式。 如果您没有使用QueryParser(如果构造正确,它会以与索引文本相同的方式分析文本(,而是说您正在使用如下TermQuery

var tq = new TermQuery("Field", "Turbo_Boost");

这可能会导致搜索失败。 这与用于索引文档拆分或更改索引时"Turbo_Boost"大小写的Analyzer有关,导致搜索时的字符串比较为 f

第三个,甚至更有可能,与您用于索引项目的Analyzer类有关,而不是您用来搜索的类。 使用相同的分析器非常重要,因为每个分析器使用不同的Tokenizer将文本拆分为可搜索的术语。

让我使用您自己的Turbo_Boost查询为您提供一些示例,说明每个分析器如何将文本拆分为术语:

关键字分析器,空白分析器 ->字段:Turbo_Boost

简单分析仪,停止分析仪 -> 磁场:涡轮增压 磁场:升压

标准分析仪 -> 磁场:涡轮增压 磁场:升压

您会注意到一些Analyzers在下划线字符上拆分术语,而KeywordAnalyzer保留它。 搜索时使用相同的分析器非常重要,因为您可能不会获得相同的结果。 它还可能导致有时查询会找到结果而有时找不到结果的问题,所有这些都取决于所使用的查询。

作为旁注,如果您使用的是 StandardAnalyzer ,将其传递给 IndexWriterQueryParser 的相同Version也很重要,因为解析方式存在差异,具体取决于您希望它模拟的 Lucene 版本。

我猜你的问题是上述原因之一。