こんにちは、habrozhiteli!
PostgreSQLの拡張機能を紹介します。これにより、PostgreSQLからSphinxに検索クエリを送信し、これらのクエリの結果を取得できます。
実装の詳細と、catの下のリポジトリへのリンク。
まえがき
1つの大きなWebプロジェクトでは、フルテキストSphinxエンジンを使用する必要がありました。 また、データベース内で巧妙に定義されたルールに従ってSphinxからのクエリの結果をさらにソートする必要がなければ、すべてがうまくいくでしょう。
そして、明らかな疑問が生じました:どうやって? 少なくとも2つのオプションがあります。
- Sphinxで全文クエリを作成し、アプリケーションで結果を並べ替えます。
- PostgreSQLのSQLの機能を使用して、データベースでの追加処理の可能性のある表形式でSphinxから検索クエリデータを取得します。
これらのオプションの長所と短所をすべて検討した後、sphinxlink拡張機能が実装されました。 実装のアイデアは、 dblink拡張機能から正直に覗かれました。
拡張機能と実装の詳細
dblinkと同様に、すべてはCで記述されたSQL関数を使用して管理されます。
Sphinxと対話するためのクライアントプロトコルはmysql対話プロトコルに対応しています。つまり、最も一般的なmysql-clientライブラリを使用してSphinxに接続できます。
Sphinxサーバーに接続するには、 sphinx_connect()関数を使用します。
SELECT * FROM sphinx_connect('myconn'); sphinx_connect ---------------- OK (1 )
接続はHTAB構造の形式でバックエンドの静的メモリ領域に作成されるため、セッションを閉じると、作成されたSphinxへのすべての接続が閉じられます。
Sphinxと接続パラメーターで開いている接続のリストを表示するには、 sphinx_connections()関数を使用します。
SELECT * FROM sphinx_connections(); conname | host | port ---------+-----------+------ myconn | 127.0.0.1 | 9306 (1 )
そして今、検索クエリを送信して結果を取得する方法。
検索クエリの結果を表形式で取得することは、 sphinx_query()関数で実装されます。 結果を正しく形成するには、列の名前とそのデータ型を示すことが重要です。
たとえば、Sphinxで次の構造のインデックスを作成します。
DESC myindex; +---------+--------+ | Field | Type | +---------+--------+ | id | bigint | | content | field | | title | string | +---------+--------+
コンテンツフィールドにはドキュメントのテキスト(A.P. Chekhovのストーリーなど)が含まれ、 タイトルフィールドにはストーリーの名前が含まれ、 idフィールドにはテキスト識別子(Sphinxのサービスフィールド)が含まれます。
SELECT * FROM sphinx_query('myconn', 'SELECT weight(), * FROM myindex WHERE MATCH('''')') AS (weight integer, docid integer, title text); weight | docid | title --------+-------+------- 1680 | 3 | (1 )
最後のリクエストのメタ情報をリクエストするには、 sphinx_meta()関数が使用されます:
SELECT * FROM sphinx_meta('myconn'); varname | value -------------+-------- total | 1 total_found | 1 time | 0.000 keyword[0] | docs[0] | 1 hits[0] | 1 (6 )
この関数は便宜上作成されています。 sphinx_query()関数を使用してSHOW METAリクエストを送信することにより、同様の効果を実現できます。
不要な接続を閉じるには、 sphinx_disconnect()関数を使用します。
SELECT * FROM sphinx_disconnect('myconn'); sphinx_disconnect ------------------- OK (1 )
実施計画
モジュールの現在の実装には、いくつかの欠点があります。
- 接続パラメーターはPostgreSQLセッションの終了時に保存されません-接続パラメーターを取得するために実際のテーブルに保存される操作モードが必要です。
- 説明されていることはすべて、Sphinxインデックスの読み取り要求に当てはまりますが、RTインデックスの管理機能はありません。
- あなたの提案は?
従来、このような投稿については、githubへのリンクを残しています: sphinxlink 。
コメントや提案は大歓迎です。 ご清聴ありがとうございました!