sphinxsearchでの検索関連性の改善

Sphinxsearchは高速な全文検索のための検索エンジンです。mysql、oracle、mssqlからデータを受信でき、リポジトリ自体(リアルタイムインデックス)として機能できます。 また、sphinxには、apiおよびsphinxqlを介した操作モードがあります。これは、最小限のコード変更でサイト上のsphinxを介して検索を接続できるsqlプロトコルに類似しています(いくつかの制限があります)。 これは、ロシアで開発された数少ない、大規模でオープンなプロジェクトの1つです。 私の人生で、sphinxがmysqlからの200万件のレコードに対して約100-200の検索クエリを処理し、同時にサーバーが自由に呼吸して気分が悪くなるのを見ました。



私の意見では、スフィンクスのドキュメントの主な問題は、最も興味深い設定の少数の例です。今日は、例でそれらについて説明しようと思います。 主にアルゴリズムと検索バリエーションをカバーするオプション。 sphinxと密接に連携する人は誰も新しいことを学ばないでしょう。初心者が自分のサイトでの検索の質を改善できることを願っています。



Sphinxには、インデクサーとsearchdの2つの独立したプログラムが含まれています。 最初はデータベースから取得したデータにインデックスを構築し、2番目は構築されたインデックスを検索します。 それでは、sphinxの検索設定に移りましょう。



形態学


単語の形態を指定できます。私はステミングのみを使用します。 言語の一連の規則を使用して、ステミングアルゴリズムは末尾と接尾辞を切り捨てます。 ステミングは既製の単語ベースを使用しませんが、言語の割礼の特定のルールに基づいているため、小さくて高速になりますが、ミスを犯す可能性があるため、短所も増えます。



ロシア語の語幹の単語の正規化の例。

単語「apple」、「apple」、「apple」は「apples」にクリップされ、単語「apple」のバリエーションを持つ検索クエリも正規化され、上記の単語を含むエントリが検索されます。



英語の場合、単語「dogs」および「dog」は「dog」に正規化されます。

たとえば、スフィンクスでは、単語curlyをインデックスに入れる必要があります。単語curlyはインデックスに入り、curly、curlyなどのバリエーションがあります。

ロシア語、英語、または両方の言語のステミングを有効にできます



形態= stem_en

形態= stem_ru

形態= stem_enru



また、オプションのSoundexとMetaphoneを使用して、単語の音を考慮に入れて英語で使用することもできます。 私は仕事でこれらの形態学的アルゴリズムを使用していないので、誰かがそれらについて多くを知っているなら、私は読んでうれしいです。 ロシア語の場合、このようなアルゴリズムにより、単語「sun」と「sun」から、これらの単語の音と発音に基づいて取得される正規化された形式の「sun」を取得できます。



形態= stem_enru、Soundex、Metaphone



形態学のために外部エンジンを接続するか、独自のエンジンを作成できます。



ワードフォーム



それはあなたの単語形式の辞書を接続することを可能にし、専門化されたテーマのサイトでよく使われ、ドキュメントの良い例があります。



コア2デュオ> c2d

e6600> c2d

コア2duo> c2d



モデルから名前のバリエーションまでの検索クエリのコア2デュオに関する記事を検索できます。



麻>雑草

ドープ>雑草

私の魅力>雑草

自由の草>草

喫煙するもの>雑草

草があります



また、この辞書により、ユーザーはサイトで雑草に関する情報を簡単に見つけることができます。



ワード形式の場合、ispellまたはMySpellファイルが使用されます(Open Officeで実行可能)



wordforms = /usr/local/sphinx/data/wordforms.txt



enable_star



クエリでアスタリスクを使用できます。たとえば、要求に応じて* pr *目論見書、こんにちは、近似などが見つかります。



enable_star = 1



expand_keywords



検索クエリを自動的に3つのクエリに拡張します



実行中->(実行中| *実行中* | =実行中)



形態を示す単語、アスタリスクを含む単語、および単語の完全一致。 以前は、このオプションはありませんでした。アスタリスクで検索するには、手動で追加のリクエストを行う必要がありましたが、1つのオプションですべてがオンになりました。 また、検索結果の自動一致は、アスタリスクと形態を使用した検索よりも高くなります。



expand_keywords = 1



index_exact_words



形態学的に正規化された形式とともに、元の単語をインデックスに保存できます。 これによりインデックスのサイズが大幅に増加しますが、前のオプションを考慮すると、より関連性の高い結果を表示できます。



たとえば、このオプションのない3つの単語「cantaloupe」、「cantaloupe」、「cantaloupe」があり、3つの単語はすべてカンタロープとしてインデックスに保存され、リクエストに応じて「cantaloupe」がインデックスに追加される順に発行されます。つまり、「cantaloupe」、「cantaloupe」 、「メロン」。

expand_keywordsおよびindex_exact_wordsオプションを有効にすると、クエリ「メロン」は、「メロン」、「メロン」、「メロン」のより関連性の高い結果を表示します。



index_exact_words = 1



min_infix_len



単語インフィックスの一部にインデックスを付け、*を使用して検索します(検索*、*検索、*検索*など)。

たとえば、min_infix_len = 2で、インデックスに「test」という単語を入力すると、「te」、「ec」、「ct」、「tes」、「eats」、「test」がインデックスに保存され、リクエストに応じて「ec」が見つかりますその言葉。



私は通常使用します



min_infix_len = 3



値を小さくするとガベージが多くなりすぎます。このオプションを使用するとインデックスが大幅に増加することに注意してください。



min_prefix_len



これはmin_infix_lenの子であり、ほぼ同じことを行います;単語または接頭辞の先頭のみを保存します。

たとえば、min_infix_len = 2で、インデックスに「test」という単語を入力すると、「those」、「tes」、「test」がインデックスに保存され、「ec」のリクエストでこの単語が見つかります。

min_prefix_len = 3



min_word_len





インデックス作成の最小単語サイズ。デフォルトは1で、すべての単語にインデックスを付けます。

通常使用

min_word_len = 3

通常、小さな単語には意味的な負荷はありません。



html_strip



すべてのhtmlタグとhtmlコメントを切り取ります。 このオプションは、sphinxsearchに基づいてgoogle / yandexを構築する場合に関連します。 彼らはスパイダーを開始し、サイトをスパースし、データベースに入れ、インデクサーを設定します。このオプションを使用すると、HTMLタグの形でゴミを取り除き、サイトコンテンツのみで検索できます。



私自身は残念ながらそれを使用しませんでしたが、ドキュメントはあらゆる種類のxmlおよび非標準のhtml(たとえば、タグの開始および終了などがヒットする)を台無しにできると述べています。



html_strip = 1



ご質問や説明をお待ちしております。

オフサイトsphinxsearch.com

記事があなたにとって興味深かったなら、それをプラスするのが面倒ではありません。



All Articles