sphinx全文検索のPHP使用チュートリアル
15586 ワード
これは半年前に対外的に書かれていない文章で、今出して分かち合います.正しくないところや厳密でないところがあるかもしれませんが、軽い言葉があるかもしれません.許してください.
前編[表示]ではsphinxの基本的なインストール、構成、使用について説明していますが、PHPに適用する方法を見てみましょう.
きそ
以上のemailデータテーブルを例に挙げます.
データ構造:
コンソールを開くには、sphinxに接続するには、コンソールPHPを開く必要があります(インデックスソースが確立されていることを確認してください):
d:\coreseek\bin\searchd -c d:\coreseek\bin\sphinx.conf
Coreseek/apiディレクトリの下にPHPのインタフェースファイルsphinxapiが提供されている.php、このファイルにはSphinxClientのクラスが含まれています.
PHPでこのファイルを導入して、new
$resultは配列です.
totalは一致するデータの合計数です
matchesはid,attrsなどの情報を含むマッチングデータです
wordsはキーワードを検索する分詞です
なぜメールの内容がないのか不思議かもしれませんが、sphinxはmysqlのようなデータ配列を返しません.sphinxはもともと完全なデータを記録していないので、分詞されたデータだけを記録しています.
具体的にはmatches配列も見ますが、matchesのIDはプロファイルのsql_を指しますquery SELECT文の最初のフィールドです.プロファイルでは
sql_query = SELECT emailid,fromid,toid,subject,content,sendtime,attachement FROM email
だからmatchesのIDはemailidです
weightとはマッチングの重みを指し、一般的に重みが高いほど返される優先度も最も高く、マッチングの重みに関する内容は公式ドキュメントを参照してください.
attrsはプロファイルのsql_ですattr_の情報は、後でこれらの属性の使い方について説明します.
これだけ言っても、検索結果は私たちが望んでいるemailデータではありませんが、sphinxは実際のデータを記録していないので、実際のemailデータを取得するにはmatchesのIDに基づいてmysqlのemailテーブルを検索しなければなりませんが、全体的にこのような1回の速度はmysqlのLIKEよりはるかに速く、数十万以上のデータ量を前提としています.そうでなければsphinxを使うのはもっと遅いだけです.
次にsphinxのmysqlのような条件の使い方を紹介します
ソート・モード
検索結果をソートするには、次のモードを使用します.
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は、クエリ全体を1つのフレーズと見なし、順序で完全に一致することを要求します.
SPH_MATCH_BOOLEAN、クエリーをブール式と見なす
SPH_MATCH_EXTENDEDは、クエリをCoreSeek/Sphinx内部クエリ言語の式と見なす.バージョンCoreseek 3/Sphinx 0.9から.9から、このオプションはオプションSPH_MATCH_EXTENDED 2の代わりに、より多くの機能とパフォーマンスを提供します.このオプションを保持するのは、SphinxおよびそのコンポーネントがAPIのアップグレードを含む場合でも、古いアプリケーションコードが動作し続けるように、残された古いコードと互換性を持つためです.
SPH_MATCH_EXTENDED 2は、第2版の「拡張マッチングモード」を使用してクエリーをマッチングする.
SPH_MATCH_FULLSCANは、後述する「フルスキャン」モードを強制的に使用してクエリーをマッチングします.なお、このモードでは、フィルタ、フィルタ範囲、およびパケットは依然として機能するが、テキストマッチングは発生しない.
私たちが注目しなければならないのは主にSPHです.MATCH_EXTENDED 2拡張マッチングモード、拡張マッチングモードmysqlのような条件文を使用することができます
拡張一致モードでは検索するフィールドが特筆されています.このフィールドに属性が設定されている場合、拡張一致検索のフィールドにはデフォルトではこれらの属性は含まれておらず、SetFilter()やSetFilterRange()などしか使用できません.
以前はfromid、toid、sendtimeを属性として設定していましたが、拡張マッチングモードで条件として使用したい場合はどうすればいいですか?
sql_にいる限りquery文でこのフィールドをもう一度選択すればいいです
sql_query = SELECT emailid,fromid,fromid,toid,toid,subject,content,sendtime,sendtime,attachement FROM email
//設定完了索引の再作成を覚えている
その他の条件テクニック
いくつかのテクニックですが、推奨されていない導入環境では、なぜかについては、記事の末尾を参照してください.
<、<=、>、>=
デフォルトsphinxにはこれらの比較子はありません.
もし私がメールの送信時間がある日付より大きいとしたらどうしますか?SetFilterRange()法でシミュレーションしてみる
IS NOT NULL
どのように空のフィールドを検索するか、例えば添付ファイルが空のメールを検索すると、@attachment(')でいいのではないかと思う人がいるかもしれません.実はこれは2つの引用符を検索します...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()を使用できます
まとめ
無料で使いやすく、極速の全文検索エンジンを考えたいなら、sphinxは間違いなく最高の選択ですが、sphinxの目的:全文検索を忘れないでください.あれらのめちゃくちゃな条件を考えないでください.sphinx検索をmysqlのように柔軟にしたいなら、複雑な多条件検索、メールのような高度な検索を完全に単独で使用することができます.PHPやmysqlコードの最適化に多くの時間を費やすことをお勧めします.それは検索を遅くする可能性があります.
最も簡単な方法でコンテンツを検索し、mysqlデータベースにIDを返して検索するのが最善です.
前編[表示]ではsphinxの基本的なインストール、構成、使用について説明していますが、PHPに適用する方法を見てみましょう.
きそ
以上のemailデータテーブルを例に挙げます.
データ構造:
CREATE TABLE email (
emailid mediumint(8) unsigned NOT NULL auto_increment COMMENT ' id',
fromid int(10) unsigned NOT NULL default '0' COMMENT ' ID',
toid int(10) unsigned NOT NULL default '0' COMMENT ' ID',
content text unsigned NOT NULL COMMENT ' ',
subject varchar(100) unsigned NOT NULL COMMENT ' ',
sendtime int(10) NOT NULL COMMENT ' ',
attachment varchar(100) NOT NULL COMMENT ' ID, ',
PRIMARY KEY (emailid),
) ENGINE=MyISAM';
コンソールを開くには、sphinxに接続するには、コンソールPHPを開く必要があります(インデックスソースが確立されていることを確認してください):
d:\coreseek\bin\searchd -c d:\coreseek\bin\sphinx.conf
Coreseek/apiディレクトリの下にPHPのインタフェースファイルsphinxapiが提供されている.php、このファイルにはSphinxClientのクラスが含まれています.
PHPでこのファイルを導入して、new
$sphinx = new SphinxClient();
//sphinx
$sphinx->SetServer ( 'loclahost', 9312 );
// php
$sphinx->SetArrayResult ( true );
// , : , ,
$sphinx->SetLimits(0, 20, 1000);
//
$sphinx->SetMaxQueryTime(10);
// , ,
$index = 'email' // index , , :'email,diary' '*'
$result = $sphinx->query (' ', $index);
echo '<pre>';
print_r($result);
echo '</pre>';
$resultは配列です.
totalは一致するデータの合計数です
matchesはid,attrsなどの情報を含むマッチングデータです
wordsはキーワードを検索する分詞です
なぜメールの内容がないのか不思議かもしれませんが、sphinxはmysqlのようなデータ配列を返しません.sphinxはもともと完全なデータを記録していないので、分詞されたデータだけを記録しています.
具体的にはmatches配列も見ますが、matchesのIDはプロファイルのsql_を指しますquery SELECT文の最初のフィールドです.プロファイルでは
sql_query = SELECT emailid,fromid,toid,subject,content,sendtime,attachement FROM email
だからmatchesのIDはemailidです
weightとはマッチングの重みを指し、一般的に重みが高いほど返される優先度も最も高く、マッチングの重みに関する内容は公式ドキュメントを参照してください.
attrsはプロファイルのsql_ですattr_の情報は、後でこれらの属性の使い方について説明します.
これだけ言っても、検索結果は私たちが望んでいるemailデータではありませんが、sphinxは実際のデータを記録していないので、実際のemailデータを取得するにはmatchesのIDに基づいてmysqlのemailテーブルを検索しなければなりませんが、全体的にこのような1回の速度はmysqlのLIKEよりはるかに速く、数十万以上のデータ量を前提としています.そうでなければsphinxを使うのはもっと遅いだけです.
次にsphinxのmysqlのような条件の使い方を紹介します
//emailid
$sphinx->SetIdRange($min, $max);
// , sql_attr_ ,
sql_attr_uint = fromid
sql_attr_uint = toid
sql_attr_timestamp = sendtime
// ,
//
$sphinx->SetFilter('fromid', array(1,2)); //fromid 1 2
// ,
$sphinx->SetFilter('fromid', array(1,2), false); //fromid 1 2
//
$sphinx->SetFilterRange('toid', 5, 200); //toid 5-200
// ,
$sphinx->SetFilterRange('toid', 5, 200, false); //toid 5-200
//
$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モード、ある算術式でソート
//
// fromid , SetSortMode
$sphinx->SetSortMode ( "SPH_SORT_ATTR_DESC", 'fromid');
// SPH_SORT_EXTENDED
//@id sphinx , emailid, emailid,
$sphinx->SetSortMode ( "SPH_SORT_ATTR_DESC", 'fromid ASC, toid DESC, @id DESC');
//
$result = $sphinx->query(' ', '*');
//
一致モード
次のオプションのマッチング・モードがあります.
SPH_MATCH_ALLは、すべてのクエリー語(デフォルトモード)に一致します.
SPH_MATCH_ANYは、クエリー語のいずれかに一致します.
SPH_MATCH_PHRASEは、クエリ全体を1つのフレーズと見なし、順序で完全に一致することを要求します.
SPH_MATCH_BOOLEAN、クエリーをブール式と見なす
SPH_MATCH_EXTENDEDは、クエリをCoreSeek/Sphinx内部クエリ言語の式と見なす.バージョンCoreseek 3/Sphinx 0.9から.9から、このオプションはオプションSPH_MATCH_EXTENDED 2の代わりに、より多くの機能とパフォーマンスを提供します.このオプションを保持するのは、SphinxおよびそのコンポーネントがAPIのアップグレードを含む場合でも、古いアプリケーションコードが動作し続けるように、残された古いコードと互換性を持つためです.
SPH_MATCH_EXTENDED 2は、第2版の「拡張マッチングモード」を使用してクエリーをマッチングする.
SPH_MATCH_FULLSCANは、後述する「フルスキャン」モードを強制的に使用してクエリーをマッチングします.なお、このモードでは、フィルタ、フィルタ範囲、およびパケットは依然として機能するが、テキストマッチングは発生しない.
私たちが注目しなければならないのは主にSPHです.MATCH_EXTENDED 2拡張マッチングモード、拡張マッチングモードmysqlのような条件文を使用することができます
//
$sphinx->SetMatchMode ( "SPH_MATCH_EXTENDED2" );
// , @ , ,toid 1 :
$result = $sphinx->query('@content ( ) & @toid =1', '*');
// &( )、|、( )、-( , !=)
$result = $sphinx->query('(@content ( ) & @subject = ) | (@fromid -(100))', '*');
//
拡張一致モードでは検索するフィールドが特筆されています.このフィールドに属性が設定されている場合、拡張一致検索のフィールドにはデフォルトではこれらの属性は含まれておらず、SetFilter()やSetFilterRange()などしか使用できません.
以前はfromid、toid、sendtimeを属性として設定していましたが、拡張マッチングモードで条件として使用したい場合はどうすればいいですか?
sql_にいる限りquery文でこのフィールドをもう一度選択すればいいです
sql_query = SELECT emailid,fromid,fromid,toid,toid,subject,content,sendtime,sendtime,attachement FROM email
//設定完了索引の再作成を覚えている
その他の条件テクニック
いくつかのテクニックですが、推奨されていない導入環境では、なぜかについては、記事の末尾を参照してください.
<、<=、>、>=
デフォルト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(')でいいのではないかと思う人がいるかもしれません.実はこれは2つの引用符を検索します...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コードの最適化に多くの時間を費やすことをお勧めします.それは検索を遅くする可能性があります.
最も簡単な方法でコンテンツを検索し、mysqlデータベースにIDを返して検索するのが最善です.