假设我有像
这样的文档stringfield:123456
textfield:name website stackoverflow
如果我按以下方式构建查询
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_42);
QueryParser luceneQueryParser = new QueryParser(Version.LUCENE_42, "", analyzer);
Query luceneSearchQuery = luceneQueryParser.parse("textfield:\"name website\"");
它将按预期返回文档,但是如果我使用Lucene QueryAPI构建我的查询
PhraseQuery firstNameQuery = new PhraseQuery();
firstNameQuery.add(new Term("textfield","name website"));
它不会给我任何结果,我将必须标记“名称网站”并在phrasequery中添加每个标记。
在解析字符串查询时,QueryAPI中是否存在任何标记化的默认方式。 当然,我可以自己做,但如果它已经实施,重新发明轮子。
答案 0 :(得分:2)
您将整个查询作为单个术语添加到PhraseQuery中。你处于正确的轨道上,但是当被标记化时,这不是一个单独的术语,而是两个术语。也就是说,您的索引包含 name , website 和 stackoverflow 这两个术语,但您的查询只有一个术语,它们不匹配< em>名称网站。
使用PhraseQuery的正确方法是将每个术语分别添加到PhraseQuery中。
PhraseQuery phrase = new PhraseQuery();
phrase.add(new Term("textfield", "name"));
phrase.add(new Term("textfield", "website"));
答案 1 :(得分:0)
当你:
luceneQueryParser.parse("textfield:\"name website\"");
Lucene将对字符串“name website”进行标记,并获得2个术语。
当你:
new Term("textfield","name website")
Lucene不会将字符串“name website”标记,而是将整体用作术语。
结果就是你所说的,当你索引文档时,字段文本字段必须被索引和标记。