あなたが必要なものの詳細を知らなくても、あなたはおそらく、次のいずれかを実行します:
私はスフィンクスのインストールと構成に何が関係しているのか完全には知りません。しかし、私はあなたがそれをデータベースに向け、どのフィールドにインデックスを付けるか、どのように結果に重みを付けるかを伝えることができるという印象の下にあります。これにより、一致するレコードの順序付きリストが返されます。
ユーザー向けまたはミッションクリティカルなものについては、既存の検索ツールを使用してください。
あなたが学問的であると感じているなら... ngramsで遊んでください:
ngramsルックアップテーブルは、潜在的な一致の最初のセットとして機能し、レーベンシュタイン距離を使用して結果をプルーニングおよびソートできます。
people
あなたが検索したいと仮定すると、あなたは次のようなことをするかもしれません:
_ people _________
personId: int
name: varchar
soundex_name: varchar
_ people_ngrams __
personId: int
ngramId: int
_ ngrams _________
ngramId: int
ngram: char(3)
count: int
ngramを定期的に再構築することも、オンザフライで構築することもできます。どちらの場合も、単純で単純な検索アルゴリズムは次のようになります。
search_ngrams = ngrammify(soundex(search_string));
notable_ngrams = select top 10 *
from ngrams
where ngram in (search_ngrams)
order by count asc;
possible_matches = select top 1000 distinct people.*
from people_ngrams, people
where ngramId in (notable_ngrams);
best_matches = top 100 possible_matches
ordered by Levenshtein_distance(match, soundex(search_string));
これとかなり似たもの(ただし、ngramの「人気」の調整、ブラックリスト、ホワイトリストなど)を使用して、この種のアルゴリズムはデータセット間でレコードをあいまいにマージし、カスタムファジー検索を容易にしました。ユーティリティおよび進行中のレコードの重複除外の取り組み。
さて、私の場合、数百万のレコードを照合するのではなく、2つのデータセット間でそれぞれ数十万のレコードのオーダーで可能な限り最適なマージを選択しようとしていました。そして、数分以内に、それをかなり迅速に機能させたいと考えました。(クイック、100,000 * 100,000とは何ですか?)そして、成功しました。
したがって、適切なチューニングを行うことで、この種のことは迅速かつ効果的になる可能性があります。私たちは最終的に、数分で、日付の古い控えめなデュアルコアマシンでマージされたセットを作成できました。しかし、ngramの人気/関連性のスイートスポット、適切な文字列距離のしきい値、ブラックリスト、ホワイトリストなどを見つけるには、かなりの時間がかかりました。
それは言った、あなたは本当にこのようなものに取り組んでいる穴に吸い込まれることができます。実際のプロダクションレベルのものについては、通常、この種の検索用に既に作成および最適化されている、確立されたツールを使用する必要があります。
同様にスフィンクスやLuceneを。