让Lucene在术语中包含完全匹配的空格

时间:2009-03-09 15:18:10

标签: c# lucene.net

我希望我的Lucene查询包含类似于:

的内容
  

companyNam:梅赛德斯卡车

它将在companyName字段中对字符串“mercedes trucks”进行完全匹配。
companyName是一个未加密的字段,但任何带空格的字段都会返回null结果..

new TermQuery(new Term("companyName", "mercedes trucks"));

如果涉及空间,则始终结果为0。否则我的程序工作正常。

7 个答案:

答案 0 :(得分:9)

使用像这样的PhraseQuery:

//create the query objects
BooleanQuery query = new BooleanQuery();
PhraseQuery q2 = new PhraseQuery();
//grab the search terms from the query string
string[] str = Sitecore.Context.Request.QueryString[BRAND_TERM].Split(' ');
//build the query
foreach(string word in str)
{
  //brand is the field I'm searching in
  q2.Add(new Term("brand", word.ToLower()));
}

//finally, add it to the BooleanQuery object
query.Add(q2, BooleanClause.Occur.MUST);

//Don't forget to run the query
Hits hits = searcher.Search(query);

希望这有帮助!

答案 1 :(得分:9)

也许替换:

mercedes trucks 

mercedes?trucks

适合我。

答案 2 :(得分:4)

您在搜索时可能使用的是与您创建索引的分析器不同的分析器。

在搜索时尝试使用KeywordAnalyzer。它将创建搜索字符串的单个标记,这可能就是您要查找的内容。

答案 3 :(得分:0)

我在这里猜测 - exactMask是否在字符串周围添加引号?你应该简单地使用字符串“mercedes truck”,而不是操纵它。

new TermQuery(new Term("companyName", "mercedes trucks"));

答案 4 :(得分:0)

您是否考虑过使用PhraseQuery?该领域是否必须未被驯服?我相信未经说明的是ids等,而不是有几个单词作为其内容的领域。

答案 5 :(得分:0)

我发现最好的方法是使用关键字分析器解析查询,并使用以下查询“mercedes?trucks”。

答案 6 :(得分:-1)

即使我面临同样的问题。你必须做以下事情摆脱这个问题。 1)将字段值添加到文档时,删除其间的空格。 2)将字段值设为小写。 3)以小写形式创建搜索文本。 4)删除搜索文本中的空格。 问候 〜SHEF