1

例: Lucene ドキュメントに「説明」列があります。「説明」の内容が [ hello foo bar]だとしましょう。クエリ [ hello f] が必要な場合は、ドキュメントがヒットする必要があります。[ hello ff] または [ hello b] はヒットしないはずです。

プログラムによる を作成する方法を使用してQuery、 などをPrefixQueryTermQuery追加しましたBooleanQueryが、期待どおりに動作しません。StandardAnalyzer使用されている。

テストケース:

a): new PrefixQuery(new Term("description", "hello f"))-> 0 ヒット

b): PhraseQuery query = new PhraseQuery(); query.add( new Term("description", "hello f*") )-> 0 ヒット

c): PhraseQuery query = new PhraseQuery(); query.add( new Term("description", "hello f") )-> 0 ヒット

推奨事項はありますか?ありがとう!

4

2 に答える 2

1

Term複数の用語を 1 つのオブジェクトに渡しているため、機能しません。すべての検索語を接頭辞で見つけたい場合は、次のことを行う必要があります。

  1. 入力文字列をアナライザーでトークン化すると、検索テキスト "hello f" が "hello" と "f" に分割されます。

    TokenStream tokenStream = Analyzer.tokenStream(null, new StringReader(searchText)); CharTermAttribute termAttribute = tokenStream.getAttribute(CharTermAttribute.class);

    リスト トークン = new ArrayList(); while (tokenStream.incrementToken()) { tokens.add(termAttribute.toString()); }

  2. 各トークンをTermオブジェクトに入れ、それを順番に入れる必要がありPrefixQueryますPrefixQueriesBooleanQuery

編集:たとえば、次のようにします。

BooleanQuery booleanQuery = new BooleanQuery();

for(String token : tokens) {        
    booleanQuery.add(new PrefixQuery(new Term(fieldName, token)),  Occur.MUST);
}
于 2012-12-17T10:09:48.253 に答える
0

インデックス作成中にNgramまたはEdgeNgramを試しましたか?

http://lucene.apache.org/core/old_versioned_docs/versions/2_9_0/api/all/org/apache/lucene/analysis/ngram/NGramTokenizer.html

于 2012-12-17T09:32:28.977 に答える