問題の説明
ユーザーが提供するフリーテキスト入力 (「フォード モーター」などの会社名) を、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 スコアを比較して、結果の最終的な結合を行う方法だと思います
この長い質問を読んでくれてありがとう。ヘルプ/ポインタは大歓迎です。