Lucene:单个词中的多个单词

时间:2013-06-06 13:55:09

标签: java lucene

假设我有像

这样的文档
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中是否存在任何标记化的默认方式。 当然,我可以自己做,但如果它已经实施,重新发明轮子。

2 个答案:

答案 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”标记,而是将整体用作术语。

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