半年前には公開していなかった記事ですが、今回シェアさせていただきます。不正確なところや不正確なところもあるかもしれませんし、言葉遣いも荒いかもしれませんが、ご容赦ください。
例として、前の記事のメール データ テーブルを取り上げます。
データ構造:
リーリー
オープン コンソールを使用します。 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)
//设置完成记得重新建立索引 然后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)