SetFilter("forum_id",array(1,3,7)) //範囲フィルタリング//パブリケーション用にフィルタリングする場合"/> SetFilter("forum_id",array(1,3,7)) //範囲フィルタリング//パブリケーション用にフィルタリングする場合">

ホームページ  >  記事  >  バックエンド開発  >  PHP スフィンクスの簡単な例

PHP スフィンクスの簡単な例

墨辰丷
墨辰丷オリジナル
2018-05-15 17:10:192616ブラウズ

PHP Sphinx の簡単な例を紹介しますので、困っている方は参考にしてください。

コードは次のとおりです:

<?php
//sphinx简单例子
//参数筛选
//筛选cat_id=2
$cl->SetFilter("cat_id",array(2));
//仅在id为1、3、7的子论坛中搜索
$cl->SetFilter("forum_id",array(1,3,7));
 
//范围筛选
//筛选发布时间为今天,参数为int时间戳
$cl->SetFilterRange("starttime",123,124);
//筛选价格
$cl->SetFilterRange("price",10.0,99.9);
 
// 分组
//按照item_id分组,并且按照order desc排序
$cl->SetGroupBy("item_id",SPH_GROUP_ATTR,"order desc");
 
//排序模式
//按照price desc排序
$cl->SetSortMode(SPH_SORT_ATTR_DESC,"price");
 注意:会被SetGroupBy中的排序覆盖 

// 匹配查询词中的任意一个
$cl->SetMatchMode ( SPH_MATCH_ANY );
SPH_MATCH_ALL, 匹配所有查询词(默认模式);
SPH_MATCH_ANY, 匹配查询词中的任意一个;
SPH_MATCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配;
SPH_MATCH_BOOLEAN, 将查询看NDED, 将查询看作一个CoreSeek/Sphinx内部查询语言的表达式 
(参见 第 5.3 节 “扩展查询语法”). 从版本Coreseek 3/Sphinx 0.9.9开始, 
这个选项被选项SPH_MATCH_EXTENDED2代替,它提供了更多功能和更佳的性能。
保留这个选项是为了与遗留的旧代码兼容——这样即使 
S作一个布尔表达式 (参见 第 5.2 节 “布尔查询语法”);
SPH_MATCH_EXTEphinx及其组件包括API升级的时候,旧的应用程序代码还能够继续工作。
SPH_MATCH_EXTENDED2, 使用第二版的“扩展匹配模式”对查询进行匹配.
SPH_MATCH_FULLSCAN, 强制使用下文所述的“完整扫描”模式来对查询进行匹配。
注意,在此模式下,所有的查询词都被忽略,尽管过滤器、过滤器范围以及分组仍然起作用,
但任何文本匹配都不会发生.

//从0开始查询,查询30条,返回结果最多为1000
$cl->setLimits(0,30,1000);
 
// 从名称为index的sphinx索引查询“电影票”
 $cl->Query("电影票","index");
 
// 从名称为index的sphinx索引查询“电影票”
$sp->SetGroupBy(&#39;item_id&#39;,SPH_GROUP_ATTR,&#39;s_order desc&#39;);
$sp->SetFilter(&#39;city_id&#39;,&#39;1&#39;);
$sp->SetFilter(&#39;cat_id&#39;,array(1));
$sp->SetLimit(0,10,1000);
$sp->AddQuery(&#39;电影票&#39;,&#39;index&#39;);
$sp->ResetFilters();//重置筛选条件
$sp->ResetGroupBy();//重置分组
 
$sp->SetGroupBy(&#39;item_id&#39;, SPH_GROUPBY_ATTR, &#39;s_order desc&#39;);
$sp->setFilter(&#39;city_id&#39;, &#39;2&#39;);
$sp->setFilter(&#39;cat_id&#39;, array(2));
$sp->setLimits(0, 20, 1000);
$sp->AddQuery(&#39;温泉&#39;, &#39;index&#39;);
$sp->ResetFilters();// 重置筛选条件
$sp->ResetGroupBy();//重置分组
$results = $sp->RunQuries();
//by http://www.jbxue.com
?>

バッチクエリ (または複数クエリ) により、searchd は可能な内部最適化を実行し、いかなる場合でもネットワーク接続とプロセス作成のオーバーヘッドを削減できます。個別のクエリと比較して、バッチ クエリでは追加のオーバーヘッドが発生しません。したがって、Web ページで複数の異なるクエリを実行する場合は、必ずバッチ クエリの使用を検討してください。

たとえば、同じフルテキスト クエリを複数回実行し、異なる並べ替えやグループ化設定を使用すると、searchd はコストのかかる全文検索と関連性の計算を 1 回だけ実行し、これに基づいて複数のグループ化された結果を生成します。

単に検索結果を表示するだけでなく、メーカーごとにグループ化された製品の数など、カテゴリに関連する集計情報も表示する必要がある場合があります。この場合、バッチ クエリを実行すると、大幅なオーバーヘッドが節約されます。 バッチ クエリを使用しない場合、これらの本質的に同一のクエリを複数回実行して同じ一致を取得する必要があり、その結果、異なる結果セットが得られます。バッチ クエリを使用する場合は、これらのクエリを 1 つのバッチ クエリに組み合わせるだけで、Sphinx がこれらの冗長な全文検索を内部的に最適化します。

AddQuery() は、現在の設定ステータスとクエリをすべて内部的に保存し、後続の AddQuery() 呼び出しで設定を変更することもできます。以前に追加したクエリは影響を受けず、変更する方法はありません。

上記のコードを使用すると、最初のクエリは「documents」インデックスで「hello world」をクエリし、結果を関連性によって並べ替えます。2 番目のクエリは「products」インデックスで「ipod」をクエリし、結果を価格で並べ替えます。並べ替えでは、3 番目のクエリで「books」インデックスで「harry Potter」を検索しますが、結果は依然として価格順に並べ替えられます。 2 番目の SetSortMode() 呼び出しは最初のクエリには影響しませんが (すでに追加されているため)、次の 2 つのクエリは影響することに注意してください。

さらに、AddQuery() の前に設定されたフィルタリングは、後続のクエリで引き続き使用されます。したがって、最初のクエリの前に SetFilter() を使用すると、最初に ResetFilters() を呼び出してフィルタリング ルールをクリアしない限り、AddQuery() 経由で実行される 2 番目のクエリ (および後続のバッチ クエリ) に同じフィルタリングが適用されます。同時に、いつでも新しいフィルタリング ルールを追加できます。

AddQuery() は現在の状態を変更しません。つまり、既存の並べ替え、フィルタリング、グループ化の設定はすべてこの呼び出しによって変更されないため、後続のクエリで既存の設定を簡単に再利用できます。

AddQuery() は、RunQueries() の結果によって返された配列内のインデックスを返します。これは 0 から始まる増分整数です。つまり、最初の呼び出しでは 0 が返され、2 番目の呼び出しでは 1 が返されます。この便利な機能により、下付き文字が必要なときに手動で記録する必要がなくなります。

関連する推奨事項:

Yii2.0 Sphinxを使用したPHP

PHPでSphinx検索エンジンを使用する方法

PHP+Sphinx+Mysqlによる検索エンジン開発の詳細な例の説明

以上がPHP スフィンクスの簡単な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。