Sphinx全文検索PHP使い方講座

WBOY
WBOYオリジナル
2016-06-13 12:37:181014ブラウズ

Sphinx全文検索PHP使い方講座 全文検索のための PHP 使用チュートリアル
Sphinx全文検索PHP使い方講座
例として、前の記事のメール データ テーブルを取り上げます。

データ構造:


ソースプリントを表示しますか?
01.CREATE TABLE email (
02.emailid mediumint(8) unsigned NOT NULL auto_increment COMMENT '邮件id',
03.
04.fromid int(10) unsigned NOT NULL default '0' COMMENT '发送人ID',
05.
06.toid int(10) unsigned NOT NULL default '0' COMMENT '收件人ID',
07.content text unsigned NOT NULL COMMENT '邮件内容',
08.subject varchar(100) unsigned NOT NULL COMMENT '邮件标题',
09.
10.sendtime int(10) NOT NULL COMMENT '发送时间',
11.
12.attachment varchar(100) NOT NULL COMMENT '附件ID,以逗号分割', PRIMARY KEY (emailid),
13.) ENGINE=MyISAM';


オープン コンソールを使用します。 Sphinx全文検索PHP使い方講座 に接続するには、コンソール PHP を開く必要があります (インデックス ソースが確立されていることを確認してください):

d:coreseekbinsearchd -c d:coreseekbinsphinx.conf



PHP インターフェース ファイル sphinxapi.php は coreseek/api ディレクトリにあります。このファイルには Sphinx全文検索PHP使い方講座Client クラス
が含まれています。
このファイルを PHP に導入し、新しい
を作成します
ソースプリントを表示しますか?
01.$sphinx = new Sphinx全文検索PHP使い方講座Client();
02.
03.//sphinx的主机名和端口
04.
05.$sphinx->SetServer ( 'loclahost', 9312 );
06.
07.//设置返回结果集为php数组格式
08.
09.$sphinx->SetArrayResult ( true );
10.
11.//匹配结果的偏移量,参数的意义依次为:起始位置,返回结果条数,最大匹配条数
12.
13.$sphinx->SetLimits(0, 20, 1000);
14.
15.//最大搜索时间
16.
17.$sphinx->SetMaxQueryTime(10);
18.
19.
20.
21.//执行简单的搜索,这个搜索将会查询所有字段的信息,要查询指定的字段请继续看下文
22.
23.$index = 'email' //索引源是配置文件中的 index 类,如果有多个索引源可使用,号隔开:'email,diary' 或者使用'*'号代表全部索引源
24.
25.$result = $sphinx->query ('搜索关键字', $index);
26.
27.echo '
<span style="font-size:18px">';

print_r($result);

echo '</span>
';

$result は配列であり、

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

matches は、ID や attrs
などの情報を含む一致するデータです。
単語は検索キーワードの単語分割です



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

詳細は、matches 配列にも依存します。matches の ID は、構成ファイルの sql_query SELECT ステートメントの最初のフィールドを参照します。

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

したがって、一致する ID は emailid
を参照します。
重みについては、一般に重みが大きいほど優先的に返されます。重みの関連情報については、公式ドキュメント
を参照してください。
attrs は設定ファイルの sql_attr_ 内の情報です。これらの属性の使用方法については後述します


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



次に、mysql の条件に似た Sphinx全文検索PHP使い方講座 の使用法をいくつか紹介します

ソースプリントを表示しますか?
01.//emailid的范围
02.
03.$sphinx->SetIdRange($min, $max);
04.
05.
06.
07.//属性过滤,可过滤的属性必需在配置文件中设置sql_attr_    ,之前我们定义了这些
08.
09.sql_attr_uint            = fromid
10.
11.sql_attr_uint            = toid
12.
13.sql_attr_timestamp  = sendtime
14.
15.//如果你想再次修改这些属性,配置完成后记得重新建立索引才能生效
16.
17.
18.
19.//指定一些值
20.
21.$sphinx->SetFilter('fromid', array(1,2));    //fromid的值只能是1或者2
22.
23.//和以上条件相反,可增加第三个参数
24.
25.$sphinx->SetFilter('fromid', array(1,2), false);    //fromid的值不能是1或者2
26.
27.//指定一个值的范围
28.
29.$sphinx->SetFilterRange('toid', 5, 200);    //toid的值在5-200之间
30.
31.//和以上条件相反,可增加第三个参数
32.
33.$sphinx->SetFilterRange('toid', 5, 200, false);    //toid的值在5-200以外
34.
35.
36.
37.//执行搜索
38.
39.$result = $sphinx->query('关键字', '*');


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

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

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

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

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

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

SPH_SORT_EXPR モード、算術式によるソート


ソースプリントを表示しますか?
01.//使用属性排序
02.
03.//以fromid倒序排序,注意当再次使用SetSortMode会覆盖上一个排序
04.
05.$sphinx->SetSortMode ( "SPH_SORT_ATTR_DESC", 'fromid');
06.
07.//如果要使用多个字段排序可使用SPH_SORT_EXTENDED模式
08.
09.//@id是sphinx内置关键字,这里指emailid,至于为什么是emailid,自己思考一下
10.
11.$sphinx->SetSortMode ( "SPH_SORT_ATTR_DESC", 'fromid ASC, toid DESC, @id DESC');
12.
13.//执行搜索
14.
15.$result = $sphinx->query('关键字', '*');

// 詳細については、ソート モードの手順に関する公式ドキュメントを参照してください

マッチパターン
次のオプションの一致パターンが利用可能です:

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

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

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

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

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

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

SPH_MATCH_FULLSCAN は、以下で説明する「フル スキャン」モードを使用してクエリを強制的に照合します。このモードでは、すべてのクエリ用語が無視され、フィルター、フィルター範囲、およびグループ化は引き続き機能しますが、テキストの一致は発生しないことに注意してください。
主に注目したいのは、SPH_MATCH_EXTENDED2 拡張マッチング モードです。拡張マッチング モードでは、mysql
などのいくつかの条件付きステートメントを使用できます。

ソースプリントを表示しますか?
01.//设置扩展匹配模式
02.
03.$sphinx->SetMatchMode ( "SPH_MATCH_EXTENDED2" );
04.
05.//查询中使用条件语句,字段用@开头,搜索内容包含测试,toid等于1的邮件:
06.
07.$result = $sphinx->query('@content (测试) & @toid =1', '*');
08.
09.//用括号和&(与)、|、(或者)、-(非,即!=)设置更复杂的条件
10.
11.$result = $sphinx->query('(@content (测试) & @subject =呃) | (@fromid -(100))', '*');
12.
13.//更多语法请查看官方文档匹配模式的说明

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

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

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

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

//
を設定した後は必ずインデックスを再構築してください
その他の条件付きヒント
いくつかのヒントですが、デプロイメント環境での使用は推奨されません。その理由については、記事の最後を参照してください



、>=
デフォルトでは、sphinx にはこれらの比較演算子がありません。

特定の日付以降に電子メールを送信したい場合はどうすればよいですか? SetFilterRange() メソッドを使用してシミュレートします

ソースプリントを表示しますか?
01.//大于等于某一时间截$time
02.
03.$sphinx->SetFilterRange('sendtime', $time, 10000000000) //时间截最大是10个9,再加1是不可超越了。。
04.
05.
06.
07.//大于某一时间截$time
08.
09.$sphinx->SetFilterRange('sendtime', $time+1, 10000000000)
10.
11.//小于等于某一时间截$time
12.
13.$sphinx->SetFilterRange('sendtime', -1, $time)    //时间截最小是0,所以应该减1
14.
15.//大于某一时间截$time
16.
17.$sphinx->SetFilterRange('sendtime', -1, $time - 1)

NULL ではありません
空のフィールドを検索するにはどうすればよいですか? たとえば、空の添付ファイルが含まれるメールを検索したい場合、@attachment ('') で十分だと考える人もいるかもしれません。実際には、これは 2 つの一重引用符を検索しています。 。 。 sphinx によって検索される文字列は引用符で囲む必要はありません

現在、sphinx はそのような関数を提供していません。実際には、mysql ステートメントを操作できます。
sql_query = SELECT emailid,fromid,toidsubject,content,sendtime,attachment != '' asattach is not null FROM email //新しいフィールドattachisnotnullがここに返されますattachisnotnullが1の場合、添付ファイルは空ではありません

//
を設定した後は必ずインデックスを再構築してください


FIND_IN_SET()
特定の添付ファイルを含む電子メールを検索するには、mysql は FIND_IN_SET を使用して 1 つの文で検索することに慣れています。sphinx では、属性 sql_attr_multi 多値属性 (MVA) を設定で設定する必要があります。

sql_attr_multi =attachment #attachment には、カンマ区切りの添付ファイル ID、またはスペース、セミコロンなどを指定できます。スフィンクスは
を認識できます。

ソースプリントを表示しますか?
01.//设置完成记得重新建立索引
02.
03.
04.
05.然后PHP中可以使用SetFilter()
06.
07.//搜索包含附件ID为1或2邮件,mysql语法是这样FIND_IN_SET(`attachment`, '1,2')
08.
09.$sphinx->SetFilter('attachment', array(1,2))
10.
11.//可以使用SetFilterRange,搜索包含附件ID在50-100范围的邮件
12.
13.$sphinx->SetFilterRange('attachment', 50, 100)
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。