2017-06-22 10 views
0

私は部分一致で複数句クエリを取得しようとしています。 MultiPhraseQueryためJavaDocによれば:Lucene IndexReaderを使って用語を探す方法は?

論理和(OR)として扱われ、同じ位置に複数の用語を追加する可能性PhraseQueryの一般化されたバージョンは、。このクラスを使用して "Microsoft app *"というフレーズを検索するには、最初にBuilderを作成し、MultiPhraseQuery.Builder.add(Term)を "microsoft"という用語(小文字の解析を想定)で使用し、次に "app" LeafReader.terms(String)を使用してプレフィックスを取得し、「app」してから接頭辞がなくなるまで用語を繰り返して収集し、最後にMultiPhraseQuery.Builder.add(Term [])を使用して追加します。 MultiPhraseQuery.Builder.build()は完全に構築された(不変の)MultiPhraseQueryを返します。

https://lucene.apache.org/core/6_6_0/core/org/apache/lucene/search/MultiPhraseQuery.html

私はそれを言う部分で苦労しています:、接頭辞として "アプリ" LeafReader.termsを使用して(String)を持っているすべての用語を見つける...

求めてそのプレフィックスがなくなるまで、用語を繰り返して、用語を収集します。

どのようにして1つの用語を探しますか? LeafReader.terms(String)Termsとなります。iteratorメソッドはTermsEnumとなります。seekとなります。私はどのようにそれを使用して一致する用語を抽出するか分からないのですか?

答えて

1

あなたはTermsEnumを取得する方法について把握しているので、そこから、seekCeilを使用して一致させる接頭辞を探してから、TermsEnumを繰り返して、接頭辞。例:

Terms terms = MultiFields.getTerms(indexReader, "text"); 
TermsEnum termsEnum = terms.iterator(); 
List<Term> matchingTerms = new ArrayList<Term>(); 
termsEnum.seekCeil(new BytesRef("app")); 
while (termsEnum.term().utf8ToString().startsWith("app")) { 
    matchingTerms.add(new Term("text", termsEnum.term())); 
    termsEnum.next(); 
} 
System.out.println(matchingTerms); 
関連する問題