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

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

Source: https://habr.com/ru/post/J347700/


All Articles