19

Sphinxのようなフル テキスト サーバーがどのように機能するかを簡単な言葉で説明できる人はいますか? プレーン SQL では、次のような SQL クエリを使用して、テキスト内の特定のキーワードを検索します。

select * from items where name like '%keyword%';

しかし、さまざまな Sphinx プラグインによって生成された構成ファイルには、このようなクエリはまったく表示されません。代わりに、次のような SQL ステートメントが含まれており、検索を個別の ID グループに分割しているようです。

SELECT (items.id * 5 + 1) AS id, ... 
       WHERE items.id >= $start AND items.id <= $end 
       GROUP BY items.id
..
SELECT * FROM items WHERE items.id = (($id - 1) / 5)

これらのクエリがどのように機能し、どのように生成されるかを簡単な言葉で説明できますか?

4

4 に答える 4

18

転置インデックスはあなたの質問への答えです:http://en.wikipedia.org/wiki/Inverted_index

これで、sphinxを介してSQLクエリを実行すると、データベースからデータがフェッチされ、転置インデックスが作成されます。これは、Sphinxでは、キーがcrc32(word)を使用して計算された32ビット整数であり、値がその単語を持つdocumentIDのリスト。

これにより、超高速になります。

これで、データベースでさえ、検索を超高速にするための同様の構造を作成できると主張することができます。ただし、最大の違いは、Sphinx / Lucene / Solrインデックスが、リレーショナルクエリ(JOIN)をサポートしない単一テーブルデータベースのようなものであるということです[MySQLパフォーマンスブログから]。インデックスは通常、検索をサポートするためだけにあり、データの主要なソースではないことに注意してください。したがって、データベースは「第3正規形」である可能性がありますが、インデックスは完全に非正規化され、検索に必要なデータのみが含まれます。

もう1つの考えられる理由は、一般にデータベースが内部の断片化に悩まされていることです。データベースは、巨大な要求に対してあまりにも多くのセミランダムI/Oタスクを実行する必要があります。

つまり、たとえば、データベースのインデックスアーキテクチャを考慮すると、クエリはインデックスにつながり、インデックスはデータにつながります。回復するデータが広く普及していると、結果に時間がかかり、データベースで起こっているように見えます。

編集:実際の内部実装については、 searchd.cppなどのcppファイルのソースコードも参照してください。PHPラッパーが表示されているだけだと思います。

于 2012-04-24T10:06:13.367 に答える
4

あなたが見ているこれらのクエリは、データベースからデータのコピーを抽出し、独自のインデックスに入れるために sphinx が使用するクエリです。

Sphinx は、インデックスを構築するためにデータのコピーを必要とします (他の回答では、そのインデックスがどのように機能するかについて言及されています)。次に、searchd デーモンから (特定のクエリに一致する) 結果を要求します。インデックスを調べて、一致するドキュメントを返します。

選択した特定の例は、パフォーマンス上の理由からインデックスを部分に分割するために、おそらくシャーディングのためにデータの一部のみを抽出するため、非常に複雑に見えます。また、範囲クエリを使用しているため、大きなデータセットに少しずつアクセスできます。

インデックスは、次のようなはるかに単純なクエリで構築できます。

sql_query = select id,name,description from items

nameこれにより、2 つのフィールドを持つスフィンクス インデックスが作成され、description検索/クエリが可能になります。

検索すると、一意のid. http://sphinxsearch.com/info/faq/#row-storage

于 2012-04-24T12:31:33.660 に答える
1

全文検索では通常、逆索引の 1 つの実装を使用します。簡単に言えば、インデックス付きフィールドのコンテンツをトークン (単語) に分割し、各トークンによってインデックス付けされたその行への参照を保存します。たとえば、The yellow dog行 #1 とThe brown fox行 #2 のフィールドには、次のようなインデックスが入力されます。

brown  -> row#2
dog    -> row#1
fox    -> row#2
The    -> row#1
The    -> row#2
yellow -> row#1
于 2012-04-24T11:54:31.070 に答える
0

質問に対する簡単な答えは、MySQL などのデータベースは、レコードの格納とインデックス作成、および SQL 句 (SELECT、PROJECT、JOIN など) のサポートのために特別に設計されているということです。キーワード検索クエリを実行するために使用できますが、最高のパフォーマンスと機能を提供することはできません. Sphinx などの検索エンジンは、キーワード検索クエリ専用に設計されているため、より優れたサポートを提供できます。

于 2012-04-25T05:49:27.270 に答える