11

正確なフレーズに関連するすべてのドキュメントを検索する lucene ファジー クエリをコーディングする方法を探しています。「mosa employee appreciata」で検索すると、「ほとんどの従業員が感謝している」を含む文書が結果として返されます。

私は使用しようとしました:

FuzzyQeury = new FuzzyQuery(new Term("contents","mosa employee appreicata"))

残念ながら、経験的にはうまくいきません。FuzzyQuery は編集者の距離を採用しています。理論的には、適切な距離が与えられれば、「従業員の感謝」は「ほとんどの従業員が感謝する」と一致するはずです。少し奇妙に思えます。

手がかりはありますか?ありがとうございました。

4

4 に答える 4

16

ここには 2 つの問題が考えられます。まず、「コンテンツ」フィールドが分​​析され、「ほとんどの従業員が評価している」という言葉は用語ではなく、3 つの用語であると推測しています。この場合、単一の用語として定義することは適切ではありません。

ただし、リストされているコンテンツが単一の用語であっても、2 つ目の問題として、用語間の距離が離れすぎて一致が得られないことがあります。mosa employee appreicataとの間の Damerau-Levenshtein 距離most employees appreciateは 4 です (ちなみに、"Damerau-Levenshtein" の綴りでの私の平均的な最初のショットと正しい綴りの間のおおよその距離です)。Fuzzy Query は、4.0 の時点で、パフォーマンス上の制約と、2 を超える編集距離を処理することはできません。また、距離が大きくても通常は特に関係がないという前提があります。

あいまいな用語を使用してフレーズ クエリを実行する必要がある場合は、 を調べるか、一連の(特にと) をMultiPhraseQuery組み合わせてニーズを満たす必要があります。SpanQueriesSpanMultiTermQueryWrapperSpanNearQuery

SpanQuery[] clauses = new SpanQuery[3];
clauses[0] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("contents", "mosa")));
clauses[1] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("contents", "employee")));
clauses[2] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("contents", "appreicata")));
SpanNearQuery query = new SpanNearQuery(clauses, 0, true)

また、編集距離が 2 を超える個々の用語はないため、これはより効果的です。

于 2013-08-07T19:19:38.510 に答える
-1

femtoRgonからの回答は素晴らしいです!ありがとうございました。

この問題を解決する別の方法があります。

//declare a mutilphrasequery
MultiPhraseQuery childrenInOrder = new MultiPhraseQuery();

//user fuzzytermenum to enumerate your query string
FuzzyTermEnum fuzzyEnumeratedTerms1 = new FuzzyTermEnum(reader, new Term(searchField,"mosa"));
FuzzyTermEnum fuzzyEnumeratedTerms2 = new FuzzyTermEnum(reader, new Term(searchField,"employee"));
FuzzyTermEnum fuzzyEnumeratedTerms3 = new FuzzyTermEnum(reader, new Term(searchField,"appreicata"));

//this basically pull out the possbile terms from the index             
Term termHolder1 = fuzzyEnumeratedTerms1.term();
Term termHolder2 = fuzzyEnumeratedTerms2.term();
Term termHolder3 = fuzzyEnumeratedTerms3.term();

//put the possible terms into multiphrasequery
if (termHolder1==null){
    childrenInOrder.add(new Term(searchField,"mosa"));
}else{
    childrenInOrder.add(fuzzyEnumeratedTerms1.term());
}

if (termHolder2==null){
    childrenInOrder.add(new Term(searchField,"employee"));
}else{
    childrenInOrder.add(fuzzyEnumeratedTerms2.term());
}

if (termHolder3==null){
    childrenInOrder.add(new Term(searchField,"appreicata"));
}else{
    childrenInOrder.add(fuzzyEnumeratedTerms3.term());
}


//close it - it is important to close it
fuzzyEnumeratedTerms1.close();
fuzzyEnumeratedTerms2.close();
fuzzyEnumeratedTerms3.close();
于 2013-09-25T10:43:18.643 に答える