ホームページ  >  記事  >  バックエンド開発  >  Sphinx 全文検索 PHP チュートリアル_PHP チュートリアル

Sphinx 全文検索 PHP チュートリアル_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:12:46674ブラウズ


半年前には公開していなかった記事ですが、今回シェアさせていただきます。不正確なところや不正確なところもあるかもしれませんし、言葉遣いも荒いかもしれませんが、ご容赦ください。
Sphinx 全文検索 PHP チュートリアル_PHP チュートリアル
例として、前の記事のメール データ テーブルを取り上げます。
データ構造:


リーリー


オープン コンソールを使用します。 Sphinx 全文検索 PHP チュートリアル_PHP チュートリアル に接続するには、コンソール PHP を開く必要があります (インデックス ソースが確立されていることを確認してください)。
d:coreseekbinsearchd -c d:coreseekbinsphinx.conf



PHP インターフェース ファイル sphinxapi.php は coreseek/api ディレクトリに提供されています。このファイルには Sphinx 全文検索 PHP チュートリアル_PHP チュートリアルClient クラスが含まれています

このファイルをPHPに導入し、新しいファイルを作成します

リーリー リーリー ';

$result は配列です。

total は一致したデータの合計数です

matches は、ID や attrs などの情報を含む一致するデータです

Words は検索キーワードの単語分割です



なぜメールの内容に関する情報がないのか疑問に思われるかもしれません。実際、sphinx は完全なデータを記録せず、セグメント化されたデータのみを記録するため、mysql のようなデータ配列を返しません。

詳細は、matches 配列にも依存します。matches の ID は、設定ファイルの sql_query SELECT ステートメントの最初のフィールドを参照します。
sql_query = 電子メールから電子メール ID、fromid、toid、件名、内容、送信時刻、添付ファイルを選択します

したがって、一致する ID は emailid を参照します

ウェイトに関しては、マッチのウェイトを指します。一般に、ウェイトが大きいほど、最も高い優先度が返されます。ウェイトの関連情報については、公式ドキュメントを参照してください

attrsは設定ファイルのsql_attr_の情報です。これらの属性の使い方については後述します


そうは言っても、たとえ検索結果が私たちが望む電子メール データでなかったとしても、実際には Sphinx 全文検索 PHP チュートリアル_PHP チュートリアル は実際のデータを記録しないため、実際の電子メール データを取得するには、次の ID に基づいて mysql 電子メール テーブルを検索する必要があります。一般的に言えば、データ量が数十万を超える場合には、この往復の速度は依然として mysql の LIKE よりもはるかに高速です。そうでない場合は、sphinx を使用した方が遅くなるだけです。



次に、mysqlの条件に似たsphinxの使い方をいくつか紹介します

リーリー


並べ替えモード
検索結果は次のモードを使用して並べ替えることができます:

SPH_SORT_RELEVANCE モード、関連性の降順で並べ替えます (最も一致するものが最初になります)

SPH_SORT_ATTR_DESC モード、属性で降順に並べ替えます (属性値が大きいほど高くなります)

SPH_SORT_ATTR_ASC モード、属性で昇順に並べ替えます (属性値が小さいほど高くなります)

SPH_SORT_TIME_SEGMENTS モード、最初は期間 (過去 1 時間/日/週/月) による降順、次に関連性による降順

SPH_SORT_EXTENDED モードでは、SQL のような方法で列を結合し、昇順または降順で並べ替えます。

SPH_SORT_EXPR モード、算術式で並べ替えます


リーリー

//詳細については、ソートモードの説明についての公式ドキュメントを確認してください

マッチパターン
次のオプションのマッチング モードがあります:

SPH_MATCH_ALL、すべてのクエリ用語に一致します (デフォルト モード);

SPH_MATCH_ANY、クエリ単語のいずれかに一致します;

SPH_MATCH_PHRASE、クエリ全体をフレーズとして扱い、順番に完全一致する必要があります。

SPH_MATCH_BOOLEAN、クエリをブール式として扱います

SPH_MATCH_EXTENDED は、CoreSeek/Sphinx 全文検索 PHP チュートリアル_PHP チュートリアル の内部クエリ言語の式としてクエリを処理します。バージョン CoreSeek 3/Sphinx 全文検索 PHP チュートリアル_PHP チュートリアル 0.9.9 以降、このオプションはオプション SPH_MATCH_EXTENDED2 に置き換えられ、より多くの機能と優れたパフォーマンスを提供します。このオプションはレガシー コードとの互換性を保つために残されており、Sphinx 全文検索 PHP チュートリアル_PHP チュートリアル とそのコンポーネント (API を含む) がアップグレードされても、古いアプリケーション コードは引き続き動作します。

SPH_MATCH_EXTENDED2 は、「拡張一致モード」の 2 番目のバージョンを使用してクエリを照合します。

SPH_MATCH_FULLSCAN は、以下で説明する「フル スキャン」モードを使用してクエリを強制的に照合します。このモードでは、すべてのクエリ用語が無視され、フィルター、フィルター範囲、グループ化は引き続き機能しますが、テキストの一致は発生しないことに注意してください。

私たちが注目したい主な点は、SPH_MATCH_EXTENDED2 拡張マッチング モードです。拡張マッチング モードでは、mysql
などのいくつかの条件付きステートメントを使用できます。
リーリー

拡張一致モードで注目すべき点は、フィールドに属性が設定されている場合、拡張一致によって検索されるフィールドには、デフォルトでは SetFilter() または SetFilterRange() のみが使用できることです。

fromid、toid、sendtimeを属性として設定しましたが、拡張マッチングモードで条件として使用したい場合はどうすればよいでしょうか?

sql_query ステートメントでもう一度フィールドを選択するだけです

sql_query = 電子メールからメール ID、fromid、fromid、toid、toid、件名、内容、送信時刻、送信時刻、添付ファイルを選択します

// セットアップ後は忘れずにインデックスを再作成してください

更多条件技巧
只是一些技巧,但不建议使用的部署环境中,至于为什么,请看文章结尾



、>=
默认sphinx没有这些比较符。

假如我想邮件的发送时间大于某一日期怎么办?用SetFilterRange()方法模拟一下

//大于等于某一时间截$time

$sphinx->SetFilterRange('sendtime', $time, 10000000000) //时间截最大是10个9,再加1是不可超越了。。

 

//大于某一时间截$time

$sphinx->SetFilterRange('sendtime', $time+1, 10000000000)

//小于等于某一时间截$time

$sphinx->SetFilterRange('sendtime', -1, $time)    //时间截最小是0,所以应该减1

//大于某一时间截$time

$sphinx->SetFilterRange('sendtime', -1, $time - 1)


IS NOT NULL
怎样搜索为空的字段,比如我要搜索附件为空的邮件,有人可能会想 @attachment ('')不就可以了吗?其实这是搜索两个单引号。。。sphinx搜索的字符串不用加引号的

目前sphinx是没有提供这样的功能,其实可以在mysql语句上作手脚:

sql_query = SELECT emailid,fromid,toidsubject,content,sendtime,attachement != '' as attach is not null FROM email //这里返回了一个新字段attachisnotnull,当attachisnotnull为1的时候附件就不为空了

//设置完成记得重新建立索引



FIND_IN_SET()
搜索包含某一附件的邮件,mysql习惯用FIND_IN_SET这么简单一句就搞定了,在sphinx中必需在配置里设置属性sql_attr_multi 多值属性(MVA):

sql_attr_multi = attachment #attachment可以是逗号分隔的附件ID,或者是空格、分号等sphinx都能识别

//设置完成记得重新建立索引

 

然后PHP中可以使用SetFilter()

//搜索包含附件ID为1或2邮件,mysql语法是这样FIND_IN_SET(`attachment`, '1,2')

$sphinx->SetFilter('attachment', array(1,2))

//可以使用SetFilterRange,搜索包含附件ID在50-100范围的邮件

$sphinx->SetFilterRange('attachment', 50, 100)


总结
如果你想一个免费、好用、极速的全文搜索引擎,sphinx无疑是最好的选择,但是不要忘记sphinx的目的:全文检索。不要去想那些乱七八糟条件。你想要把sphinx搜索变得像mysql那样灵活,可完全单独用在一些复杂的多条件搜索,像某些邮件的高级搜索,那么我建议你还是多花点时间在PHP或者mysql代码的优化上,因为那样可能会让你的搜索变得更慢。

最好的方法是以最简单的方法搜索到内容,将ID交还mysql数据库搜索。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/444552.htmlTechArticle这是半年前没有对外写的文章,现在拿出来分享下。可能会有一些不正确或不严谨的地方,某些语言可能比较轻浮,请见谅。 以上一篇的...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。