検索は簡単です

もちろん、Googleは見栄えは良いが、企業のリソースを公開するべきではない;制限付きでgoogle-miniを購入することも選択肢ではない。 印象的なサイズのデータ​​ベース(4ギガバイトのテキスト、検索が必要)での検索が必要です。 また、テキスト検索にいくつかのパラメーターによる検索を追加すると、google-miniは役に立たなくなり、本当に怖くなります。



しかし、パニックにならないでください! Sphinxが助けになります-オープンソースの検索エンジンであり、ほとんど何もせずにほとんど手間をかけずに接続できます。





Sphinxの魅力は、サイト全体を再帰的にたどってリンクをたどり、情報を引き出す(時には完全に不要な)だけでなく、私たちにとって便利な形式のデータベースをインデックスすることです。



sphinxは3つの部分で構成されています:インデクサー、コマンドラインから検索するための検索ユーティリティ、検索クエリで対処するsearchdデーモン。 ディストリビューションには、さまざまな言語でSphinxを使用する例もあります。



手始めに、おそらくスフィンクスを置くべきです。

  1. ここからソースダウンロード
  2. 解凍(tar xzf sphinx-0.9.8.tar.gz)
  3. 設定(./configure --prefix = / path / to / sphinx)
  4. ビルドとインストール(make install)


設定と作業について少し説明します



単純でわかりやすい例を使用して、検索エンジンを扱います-可能な単純化されたHabrahabr構造=)



トピックの構造を次のようにします。

 フィールドタイプ
 -----------------------
  id int(11)
  blog_id int(11)
 件名varchar(255)
 コンテンツのロングテキスト


それでは、トピックにタグを追加しましょう。ただし、タグがなければどこでも-Web 2.0

 フィールドタイプ
 -------------------
  topic_id int(11)
  tag_id int(11) 




私たちが解決しなければならず、Sphinxがうまく対処できる最も難しい検索タスクは、特定のブログのいくつかのタグでトピックをテキスト検索することです。



実際、Sphinxをベースに構成します。

設定(PREFIX / etc / sphinx.conf)を開きます。 2つの部分を構成する必要があります。

  1. ソース
  2. インデックス作成オプション


名前から推測できるように、ソースはSphinxがインデックス作成のためにデータを取得する場所です。 ソースには2つのタイプがあります。いくつかのDBMS(私が間違っていなければ、mysqlとpostgresのみが現在サポートされています)またはXMLデータベースです。 mysqlを使用します。



ソースを設定する

 ソースメイン
 {
        タイプ= mysql
         sql_host = localhost
         sql_user = root
         sql_pass =
         sql_db =テスト
         sql_port = 3306
        
         #ここまでは、すべてが明確だと思う

         #次に、SphinxにSQlリクエストを要求する必要があります。
         #彼は私たちのデータベースから情報を引き出します

         sql_query = \
                 SELECT id、subject、content FROMトピック;

         #およびトピックを取得できるリクエスト。
         sql_query_info = SELECT * FROMトピックWHERE id = $ id
 }




ソースがありますが、ここでインデックスを作成します。 インデックスは多数存在する可能性がありますが、これまでのところ必要なのは1つだけです。

 インデックスメイン
 {
         source = main#ソースmainを使用
         path = / var / lib / sphinx / main#インデックスが保存される場所
         docinfo = extern#後で必要になります
         morphology = stem_ru#クエリ「Habrahabr」が実行されるように形態を決定する
                                           #「habrahabra」、「habrahabra」も与えられました
         min_word_len = 1#最小単語サイズ。 突然前置詞を探したいですか?
         charset_type = utf-8#これは理解できる-エンコード
         html_strip = 0#HTMLをカットするかどうか。
                                     #ドキュメンテーションは、それが上でのみ正しく動作すると述べています
                                     #完璧なhtml'eだが、正直なところ、試したことがない
 }


インデクサーと検索デーモンのパラメーターは、デフォルトで残すことができます。



インデクサーを実行する

  bin / indexer --all 


--allオプションは、すべてのインデックスのインデックスを再作成する必要があることを意味します。



インデックスが構築され、検索を試みることができます。 検索ユーティリティを使用します。

 ビン/検索 


そして、habrahabrに言及しているすべてのドキュメントのリストを取得します。



検索エンジンの準備ができました! ここで、前述の問題を解決します。特定のブログで特定のタグを持つトピックを検索します。



これを行うには、Sphinxはどのタグがどのトピックに属し、どのブログにどのトピックが配置されているかを知る必要があります。



各レコードに任意の数の属性を追加できます。 トピックとブログの2つがあります。 これについてスフィンクスに伝えます。 ソース構成で、次の行を追加します。

         #タグ
         sql_attr_multi = \
                        クエリからのuintタグ。  \
                         SELECT topic_id、tag_id from tags;
         #ブログ
         sql_attr_multi = \
                        クエリからのuintブログ。  \
                         SELECT id、トピックからのブログ。


その後、データベースのインデックスを再作成し、検索ユーティリティで結果を確認します。

  bin / search -f tag 42検索ワード 


Sphinxは、タグ番号42でマークされ、「検索語」を含むトピックのリストを提供します。

残念ながら、検索ユーティリティはいくつかの属性によって検索を制限することはできませんが、APIを介してそれを行うことは可能です(共鳴がある場合は、APIについて個別に説明します)。



スフィンクスにはかなり強力な「言語」のリクエストがあります。 拡張された可解性では、一致する列の指定、角括弧付きの式の使用、検索結果の並べ替えとグループ化、並べ替え機能の設定などを行うことができます。



英語の完全なドキュメントはこちらにあります



まあ、それだけです。



PS最初のトピック。 デビューは成功しましたか? =)




All Articles