パフォーマンスの問題のほとんどは、sphinx の使用方法を変更することで解決できます。まず、sphinx でデータをインデックス化する方法に対処する必要があります。インデックス作成中に何らかの処理を行うと、検索が速くなり、結果の関連性が高まります。次に、検索用語に取り組み、最後に、使用するランキング アルゴリズムを決定します。
例として「タイトル」フィールドを使用しますが、ロジックはすべてのフィールドに複製できます。
索引付け
sphinx に 2 つのフィールド ("title" と "title_synonyms") を追加します。データベース内の各レコードに対して、次の操作を行います:-
単語に対して DISTINCT を実行して重複を削除します ("Ruby Developer / Java Developer" は "Ruby Developer / Java" になります。これにより、レコードが検索時に重複に対して 2 つのスコアを取得することがなくなります。これは "title" に入ります。
上記の DISTINCT タイトルを取得し、すべての単語を拡張同義語に置き換えます。拡張を容易にするために、シノニムを DB に入れることをお勧めします。テキストは「Ruby Developer / Java-EE」になります。各単語をすべての同義語に置き換える必要があります。Java に 2 つのシノニムがある場合、両方ともフィールドにある必要があります。これは「title_synonyms」に入ります
検索中
sphinx には 2 つのフィールドがあるため、それぞれに異なる重みを付けることができます。"title" は "10" の重みを、"title_synonyms" は "3" の重みを得ることができます。つまり、レコードが元のタイトルの 1 つより上位にランク付けされるには、4 つの同義語に一致する必要があります。ニーズに合わせてウェイトをいじることができます。
ユーザーが「Java Developer」を検索していたとします。検索フレーズについては、次の操作を行います:-
- 重複する単語を削除する
- 検索フレーズの各単語の類義語を取得する
- Sphinx のマッチング モードを SPH_MATCH_EXTENDED に設定する
上記のルールは、sphinx での検索が次のようになることを意味します:-
@title "Java 開発者" | @title_synonyms "Java-EE"
完全一致を語彙素より上位にランク付けしたい場合、検索クエリは次のようになります。
@title ("Java 開発者" | "=Java = 開発者") | @title_synonyms ("Java-EE" | "=Java-EE")
ただし、これを適切に機能させるには、SPH_RANK_PROXIMITY_BM25 または SPH_RANK_SPH04 を使用する必要があります。
ランキング
組み込みのランキング アルゴリズムのいずれかを試して、結果がどのように見えるかを確認できます。最初に SPH_RANK_MATCHANY または SPH_RANK_WORDCOUNT をお勧めします。
近接および完全一致ランキングには、独自のアルゴリズムを使用できる SPH_RANK_PROXIMITY_BM25、SPH_RANK_SPH04、または SPH_RANK_EXPR を使用します。
結論
これで、高速かつ正確な検索ができるはずです。Ruby アプリケーションで実行する必要がある作業はほとんどなく、ほとんどの作業は sphinx 内 (あるべき場所) で行われます。
お役に立てれば...