0

假设我有一个像

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"));

它不会给我任何结果,我将不得不标记“名称网站”并在短语查询中添加每个标记。

QueryAPI 中是否有任何默认方式可以像解析字符串查询时那样进行标记化。当然我可以自己做,但如果它已经实施,那就重新发明轮子。

4

2 回答 2

2

您正在将整个查询作为单个术语添加到您的 PhraseQuery。您走在正确的轨道上,但是当标记化时,这将不是一个术语,而是两个。也就是说,您的索引具有术语namewebsitestackoverflow,但您的查询只有一个术语,与这些名称 website都不匹配。

使用 PhraseQuery 的正确方法是将每个术语分别添加到 PhraseQuery。

PhraseQuery phrase = new PhraseQuery();
phrase.add(new Term("textfield", "name"));
phrase.add(new Term("textfield", "website"));
于 2013-06-06T16:15:00.660 回答
0

当你:

luceneQueryParser.parse("textfield:\"name website\"");

Lucene 将标记字符串“名称网站”,并获得 2 个术语。

当你:

new Term("textfield","name website")

Lucene 不会对字符串“name website”进行标记,而是使用整体作为一个术语。

结果就是你所说的,当你索引文档时,字段 textfield 必须被索引和标记。

于 2015-03-25T02:53:03.350 回答