为什么这个Lucene查询是“包含”而不是“startsWith”?

时间:2009-03-03 10:37:06

标签: lucene.net startswith

string q = "m";
Query query = new QueryParser("company", new StandardAnalyzer()).Parse(q+"*");

将导致查询成为prefixQuery:company:a *

我仍然会得到像“舰队非洲”这样的结果,很明显A不是一开始就会给我带来不良后果。

Query query = new TermQuery(new Term("company", q+"*"));

将导致查询成为termQuery:company:a *而不返回任何结果。可能是因为它将查询解释为完全匹配,并且我的值都不是“a *”文字。

Query query = new WildcardQuery(new Term("company", q+"*"));

将返回与prefixquery;

相同的结果

我做错了什么?

2 个答案:

答案 0 :(得分:5)

StandardAnalyzer会将“舰队非洲”标记为“舰队”和“非洲”。您的*搜索将与后期匹配。

如果您想将“Fleet Africa”视为单个术语,请使用不会在空格上分解字符串的分析器。 KeywordAnalyzer是一个示例,但您可能仍希望小写数据,以便查询不区分大小写。

答案 1 :(得分:0)

简短回答:您的所有查询都不会将搜索限制在字段的开头。 你需要一个EdgeNGramTokenFilter或类似的东西。 有关Lucene中自动完成功能的实现,请参阅this question