SphinxSearchを象で飼いならす

画像






こんにちは、habrozhiteli!



PostgreSQLの拡張機能を紹介します。これにより、PostgreSQLからSphinxに検索クエリを送信し、これらのクエリの結果を取得できます。



実装の詳細と、catの下のリポジトリへのリンク。



まえがき



1つの大きなWebプロジェクトでは、フルテキストSphinxエンジンを使用する必要がありました。 また、データベース内で巧妙に定義されたルールに従ってSphinxからのクエリの結果をさらにソートする必要がなければ、すべてがうまくいくでしょう。



そして、明らかな疑問が生じました:どうやって? 少なくとも2つのオプションがあります。





これらのオプションの長所と短所をすべて検討した後、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 )
      
      





実施計画



モジュールの現在の実装には、いくつかの欠点があります。





従来、このような投稿については、githubへのリンクを残しています: sphinxlink



コメントや提案は大歓迎です。 ご清聴ありがとうございました!



All Articles