SetFilter("forum_id",array(1,3,7)); //範圍篩選//篩選發佈時"/> SetFilter("forum_id",array(1,3,7)); //範圍篩選//篩選發佈時">

首頁  >  文章  >  後端開發  >  php sphinx的簡單實例

php sphinx的簡單實例

墨辰丷
墨辰丷原創
2018-05-15 17:10:192654瀏覽

為大家介紹一個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僅運行一次開銷昂貴的全文檢索和相關度計算,然後在此基礎上產生多個分組結果。

有時不僅需要簡單地顯示搜尋結果,而且要顯示一些與類別相關的計數信息,例如按製造商分組後的產品數目,此時批量查詢會節約大量的開銷。若無批次查詢,您會必須將這些本質上幾乎相同的查詢執行多次並取回相同的符合項,最後產生不同的結果集。若使用批次查詢,您只須將這些查詢簡單地組成一個 批次查詢,Sphinx會在內部優化掉這些冗餘的全文搜尋。

AddQuery()在內部儲存全部目前設定狀態以及查詢,您也可在後續的AddQuery()呼叫中變更設定。早先加入的查詢不會受影響,實際上沒有任何辦法可以改變它們。

使用上述程式碼,第一個查詢會在「documents」索引上查詢「hello world」並將結果依相關度排序,第二個查詢會在「products」索引上查詢「ipod」並將結果按價格排序,第三個查詢在“books”索引上搜尋“harry potter”,結果仍按價格排序。注意,第二個SetSortMode()呼叫並不會影響第一個查詢(因為它已經被加入了),但後面的兩個查詢都會受影響。

此外,在AddQuery()之前設定的任何過濾,都會被後續查詢繼續使用。因此,如果在第一個查詢前使用SetFilter(),則透過 AddQuery()執行的第二個查詢(以及隨後的批次查詢)都會套用相同的過濾,除非你先呼叫ResetFilters()來清除過濾規則。同時,你還 可以隨時加入新的過濾規則。

AddQuery()並不修改目前狀態。也就是說,已有的全部排序、過濾和分組設定都不會因這個呼叫而改變,因此後續的查詢很容易地重複使用現有設定。

AddQuery()傳回RunQueries()結果傳回的陣列中的一個下標。它是一個從0開始的遞增整數,即,第一次呼叫返回0,第二次返回1,以此類推。這個方便的特性使你在需要這些下標的時候不用手動記錄它們。

相關推薦:

Yii2.0 PHP使用Sphinx

#php中如何使用sphinx搜尋引擎

############################################################### #####PHP Sphinx Mysql開發搜尋引擎詳細實例講解#######

以上是php sphinx的簡單實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn