假设我有一个类似的文档
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 中是否有任何默认方式可以像解析字符串查询时那样进行标记化。 当然,我自己可以做到这一点,但如果它已经实现了,我就重新发明轮子。
最佳答案
您将整个查询作为单个术语添加到您的 PhraseQuery 中。你走在正确的轨道上,但当标记化时,这将不再是单个术语,而是两个。也就是说,您的索引包含术语 name、website 和 stackoverflow,但您的查询只有一个术语,与这些术语均不匹配 < em>命名网站。
使用 PhraseQuery 的正确方法是将每个术语单独添加到 PhraseQuery。
PhraseQuery phrase = new PhraseQuery();
phrase.add(new Term("textfield", "name"));
phrase.add(new Term("textfield", "website"));
关于java - Lucene:单个术语中的多个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16963969/