3

問題の説明

ユーザーが提供するフリーテキスト入力 (「フォード モーター」などの会社名) を、140 万の会社名からなる参照データ ソースと照合するカスタム アルゴリズムを実装しようとしています。

アルゴリズムは次の手順を実行します。

ステップ 1)ユーザー提供の検索入力の「完全一致」、「一致の開始」、最後に「一致の一致」を実行します。このステップの結果も同じ順序でソートされます。

ステップ 2)参照会社名を使用した検索入力のトークンごとの一致を実行します。

すべてのトークンは次の順序で照合されます: Exact、Begins、Contains、Levenshtein Distance (< 0.2)、Refined Soundex。

たとえば、ユーザー入力が「Foord Motur Holding」であり、「The Ford Motor Holdings Company」と照合される場合、最初のトークン「Foord」は、Soundex の照合に基づいて「Ford」と一致し、2 番目のトークン「Motur」は、「Motor」に基づいて一致します。 Edit Distance Algo と最後のトークン "Holding" は、Begins マッチを介して "Holdings" と一致します。

スコアリング: すべてのトークン マッチは、マッチング テクニックを評価するスケールで最初にスコアリングされます。完全一致が最良で、Soundex が最悪です。

全体のスコアは、個々のトークン マッチ スコアの加重平均を計算することにより、0 ~ 100% のスケールで計算されます。重みは、トークンのインデックス順序に基づいて割り当てられます。つまり、最初のトークンの重みが最も高く、最後のトークンの重みが最も低くなります。

私の部分的な解決策

参照会社名を格納するために、solr に単純なスキーマを実装しました。文字列フィールド (companyName と呼ばれる)、文字列からコピーされた単純なテキスト フィールド (companyText と呼ばれる)、および文字列からコピーされ、洗練された Soundex ベースのマッチングのために PhoneticFilterFactory を使用する別のテキスト フィールド (companySoundex と呼ばれる)。

ステップ 1) を単一の solr クエリで複製することができました。

ステップ 2) では、solr サーバーに対して 3 つの並列クエリを実行する予定です。companyText フィールドで単純なテキスト検索を実行する最初のクエリ、companyText フィールドで ~ 演算子を使用してあいまい一致を実行する 2 番目のクエリ、companySoundex フィールドで soundex 一致を実行する 3 番目のクエリ。これら 3 つの並列クエリの結果を何らかの形で組み合わせて、目的の最終結果を得る予定です。

質問:

1) 元のアルゴリズムのステップ 2) を複製するより良い方法はありますか?

2)「3並列クエリ」アプローチを使用したとしても、元のアルゴリズムで得られる「正しい」ソート順を取得するにはどうすればよいですか?主な問題は、これら 3 つのまったく異なるクエリの solr スコアを比較して、結果の最終的な結合を行う方法だと思います

この長い質問を読んでくれてありがとう。ヘルプ/ポインタは大歓迎です。

4

2 に答える 2

0

IMHO、この機能は、Solr が提供するすぐに使えるハンドラーでは実現できません。この方法で結果を処理およびスコアリングするカスタム クエリ ハンドラーを作成すると、より適切な結果が得られるはずです。

于 2013-04-18T08:13:30.940 に答える
0

DisMax クエリ パーサーを見てください。http://wiki.apache.org/solr/DisMaxRequestHandler

個別のクエリごとに、実際には照合用のインデックスに個別のフィールドを作成します。次に、DisMax を使用して、重み付けされた方法でクエリを結合します。

3 つの並列クエリ アプローチを今すぐあきらめることをお勧めします。前回これを調べたとき、2 つの別々のクエリのスコアを関連付けることは不可能でした。うまくいきません。スコアで並べ替えられた単一の結果セットが必要な場合は、単一のクエリでこれを行う方法を理解する必要があります。

于 2012-01-07T17:08:44.400 に答える