7

オランダ語とドイツ語には、新しい単語に結合できる単語があります。複合語。

たとえば、「accountmanager」は、「account」と「manager」という単語を組み合わせた 1 つの単語と見なされます。ユーザーは、ドキュメントとクエリで「accountmanager」と「account manager」を使用し、両方のクエリで同じ結果を期待します。

単語を分解(分割)できるようにするために、solr には、スキーマで構成した辞書フィルターがあります。

<filter class="solr.DictionaryCompoundWordTokenFilterFactory" dictionary="../../compound-word-dictionary.txt" minWordSize="8" minSubwordSize="4" maxSubwordSize="15" onlyLongestMatch="true"/>

Compound-word-dictionary.txt ファイルには、複合語を分解するために使用される単語のリストが含まれています。このリストには、たとえば「アカウント」と「マネージャー」という単語があります。

クエリ "accountmanager": (term text) で検索するときに Solr デバッガーで分析すると、分解結果は問題ありません。

  • アカウントマネージャー
  • アカウント
  • マネジャー

ただし、この結果は OR ステートメントとして扱われ、少なくとも 1 つの用語が含まれるすべてのドキュメントが検索されます。AND ステートメントのように動作させたい (したがって、ドキュメントに「アカウント」と「マネージャー」の両方の用語を含む結果のみが必要です)。

スキーマの defaultOperator を「AND」に設定しようとしましたが、edismaxを使用すると無視されます。そのため、提案されたMin-should-Matchを 100% (mm=100%) に設定しましたが、やはり望ましい結果はありません。スキーマでディクショナリ フィルタの属性を微調整しても、動作は「AND」に変わりません。

辞書の複合語トークン ファクトリを使用しているときにこの動作に遭遇し、AND ステートメントのように動作させるための解決策を知っている人はいますか?

4

2 に答える 2

4

期待どおりに機能しています。DictionaryCompoundWordTokenFilterFactoryは、見つかった「内部単語」、この場合は「account」と「manager」の両方を追加していますが、たとえば「accountbanana」と「banana」の場合は1つだけである可能性があります。辞書にない場合は、「アカウント」のみが追加されます。

これは、誰かが「マネージャー」を探し、「アカウントマネージャー」を持つドキュメントを見つけるという目的にも役立ちます。

必要な動作を取得するために(クエリ側でこれを適用していることを理解しています)、accountmanager="アカウントマネージャー"を作成する辞書を使用できます。

于 2012-06-18T12:18:07.797 に答える
4

私はこれを調べているので注意してください。これを行うと、多くのノイズが追加されます。SOLR 3.6 は、CompoundWordTokenFilterBase で壊れた各トークンの位置の増分を 0 に設定するため、正しくインデックス付けされた (一種の) クエリが取得されます。ただし、AnalyzerQueryNodeProcessor は positionCount==1 かどうかのみをチェックするため、クエリを実行すると、複合語の巨大な OR クエリが得られます。

たとえば、Castaway を検索すると、(castaway または cast または away) がクエリされます。これにより、映画 Castaway (実際には Cast Away です) が機能する多くのノイズが追加されますが、「Away」または「Cast」だけのすべてのものも得られます。

実際に Lucene にパッチを適用して setPositionIncrement を 1 に設定し、AnalyzerQueryNodeProcessor に追加のコードを追加して、OR 演算された PhraseQueryNodes (「キャストアウェイ」または「キャスト アウェイ」) が存在するようにしました。これも正しくありませんが、ノイズが減少します。(castaway0, cast1, away2) は "castaway away" の結果を返す可能性があるため、position を常に 1 に設定すると、フレーズ クエリは奇妙な結果を返す可能性があります。また、後期のポジションは現在オフになっています。詳しい説明については、http: //blog.mikemccandless.com/2012/04/lucenes-tokenstreams-are-actually.htmlを参照してください。

于 2012-12-06T17:48:01.680 に答える