我正在使用Lucene全文搜索来搜索我的应用程序。
但是,例如,如果我搜索“Turbo_Boost”,则返回0结果。
对于其他文字,它可以正常工作。
任何想法?
答案 0 :(得分:1)
假设您正在使用StandardTokenizer
,它将在下划线字符上分开。
您可以通过providing your own Tokenizer
解决此问题,这会将下划线保留在返回的Token
中(通过Filter
个实例或TokenFilter
个实例的组合)。< / p>
答案 1 :(得分:0)
Lucene的一般经验法则是使用您用于索引数据的相同Tokenizer / Analyzer来标记您的搜索查询。
答案 2 :(得分:0)
我只能想到您的查询失败的几个原因:
首先,可能最不可能的是,考虑到其他文本搜索正常,您没有设置要分析的文档字段。它不会被标记化,因此您只能搜索整个字段的确切值。同样,这个可能不是你的问题。
第二个(与第三个相关),很可能,取决于你如何执行搜索。如果您没有使用QueryParser
(如果构造正确,则会按照您对文本进行索引的方式分析文本),而是说您使用的是TermQuery
:
var tq = new TermQuery("Field", "Turbo_Boost");
这可能会导致您的搜索失败。这与您用于索引文档拆分的Analyzer
或索引时更改“Turbo_Boost”的大小写有关,导致搜索时的字符串比较为f
第三种,更有可能的是,与您用于索引项目的Analyzer
课程相比,与您用于搜索的课程相比。使用相同的分析器很重要,因为每个分析器使用不同的Tokenizer
将文本分成可搜索的术语。
让我举几个例子,使用您自己的Turbo_Boost
查询,了解每个分析器如何将文本拆分为术语:
KeywordAnalyzer,WhitespaceAnalyzer - &gt;字段:Turbo_Boost
SimpleAnalyzer,StopAnalyzer - &gt;领域:涡轮场:提升
StandardAnalyzer - &gt;领域:涡轮场:提升
您会注意到某些Analyzers
正在将该字词拆分为下划线字符,而KeywordAnalyzer
会保留该字词。在搜索时使用相同的分析器非常重要非常重要,因为您可能得不到相同的结果。它也可能导致有时查询将找到结果的问题,而其他时间则不会,这一切都取决于所使用的查询。
作为旁注,如果您使用的是StandardAnalyzer
,那么将Version
传递给IndexWriter
和QueryParser
也很重要,因为解析的完成方式不同,具体取决于您希望它模拟的Lucene版本。
我猜你的问题是上述原因之一。