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

結果は得られません。「name website」をトークン化し、各トークンをphrasequeryに追加する必要があります。

文字列クエリの解析中に行うように、QueryAPI でトークン化するデフォルトの方法はありますか。確かに私はそれを自分で行うことができますが、すでに実装されている場合は車輪を再発明します.

4

2 に答える 2

2

クエリ全体を単一の用語として PhraseQuery に追加しています。あなたは正しい道を進んでいますが、トークン化すると、それは 1 つの用語ではなく 2 つの用語になります。つまり、インデックスにはnamewebsite、およびstackoverflowという用語がありますが、クエリには 1 つの用語しかなく、これらの名前 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 に答える