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数据库搜索。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
