Lucene 不会搜索带有“_”的文本
本文关键字:文本 搜索 Lucene | 更新日期: 2023-09-27 18:09:28
可能的重复项:
Lucene 搜索和下划线
我正在使用 Lucene 全文搜索在我的应用程序中进行搜索。
但是例如,如果我搜索"Turbo_Boost",它将返回 0 个结果。
对于其他文本,它可以正常工作。
知道吗?
假设你使用的是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
,将其传递给 IndexWriter
和 QueryParser
的相同Version
也很重要,因为解析方式存在差异,具体取决于您希望它模拟的 Lucene 版本。
我猜你的问题是上述原因之一。