Lucene不会搜索带有'_'的文字

时间:2011-09-21 14:27:18

标签: c# .net lucene.net

  

可能重复:
  Lucene search and underscores

我正在使用Lucene全文搜索来搜索我的应用程序。

但是,例如,如果我搜索“Turbo_Boost”,则返回0结果。

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

任何想法?

3 个答案:

答案 0 :(得分:1)

假设您正在使用StandardTokenizer,它将在下划线字符上分开。

您可以通过providing your own Tokenizer解决此问题,这会将下划线保留在返回的Token中(通过Filter个实例或TokenFilter个实例的组合)。< / p>

答案 1 :(得分:0)

Lucene的一般经验法则是使用您用于索引数据的相同Tokenizer / Analyzer来标记您的搜索查询。

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

答案 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传递给IndexWriterQueryParser也很重要,因为解析的完成方式不同,具体取决于您希望它模拟的Lucene版本。

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