6
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+"*"));

将返回与前缀查询相同的结果;

我究竟做错了什么?

4

3 回答 3

6

StandardAnalyzer 会将“Fleet Africa”标记为“fleet”和“africa”。您的 a* 搜索将匹配后面的术语。

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

于 2011-03-30T11:20:05.920 回答
0

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

于 2009-03-03T10:53:12.873 回答
0

另一种解决方案可能是使用 StringField 来存储 ex 的数据:“Fleet Africa” 然后使用 WildCardQuery.. 现在 f* 或 F* 会给出结果,但 A* 或 a* 不会。

StringField 已编入索引但未标记化。

于 2021-11-16T12:17:18.657 回答