SetFilter("forum_id",array(1,3,7)) //범위 필터링//게시물 필터링 시"/> SetFilter("forum_id",array(1,3,7)) //범위 필터링//게시물 필터링 시">

 >  기사  >  백엔드 개발  >  PHP 스핑크스의 간단한 예

PHP 스핑크스의 간단한 예

墨辰丷
墨辰丷원래의
2018-05-15 17:10:192657검색

PHP 스핑크스의 간단한 예를 소개하겠습니다. 도움이 필요한 친구들이 참고할 수 있습니다.

코드는 다음과 같습니다.

<?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가 가능한 내부 최적화를 수행하고 어떤 경우에도 네트워크 연결 및 프로세스 생성 측면에서 오버헤드를 줄일 수 있습니다. 개별 쿼리에 비해 일괄 쿼리는 추가 오버헤드를 발생시키지 않습니다. 따라서 웹 페이지에서 여러 가지 다른 쿼리를 실행하는 경우 일괄 쿼리 사용을 고려해야 합니다.

예를 들어 동일한 전체 텍스트 쿼리를 여러 번 실행하지만 다른 정렬 또는 그룹화 설정을 사용하면 searchd는 비용이 많이 드는 전체 텍스트 검색 및 관련성 계산을 한 번만 실행한 다음 이를 기반으로 여러 그룹화된 결과를 생성합니다.

단순히 검색 결과만 표시하는 것이 아니라 제조업체별로 그룹화된 제품 수와 같은 일부 카테고리 관련 계산 정보도 표시해야 하는 경우가 있습니다. 이 경우 일괄 쿼리를 사용하면 많은 오버헤드가 절약됩니다. 일괄 쿼리가 없으면 기본적으로 동일한 쿼리를 여러 번 실행하고 동일한 일치 항목을 검색해야 하므로 결과 집합이 달라집니다. 일괄 쿼리를 사용하는 경우 이러한 쿼리를 일괄 쿼리로 결합하면 Sphinx는 이러한 중복된 전체 텍스트 검색을 내부적으로 최적화합니다.

AddQuery()는 현재 설정 상태와 쿼리를 모두 내부적으로 저장하며, 후속 AddQuery() 호출에서 설정을 변경할 수도 있습니다. 이전에 추가된 쿼리는 영향을 받지 않으며 실제로 변경할 방법이 없습니다.

위 코드를 사용하면 첫 번째 쿼리는 "documents" 인덱스에서 "hello world"를 쿼리하고 결과를 관련성에 따라 정렬합니다. 두 번째 쿼리는 "products" 인덱스에서 "ipod"를 쿼리하고 가격을 기준으로 결과를 정렬합니다. 정렬, 세 번째 쿼리는 "books" 인덱스에서 "harry Potter"를 검색하고 결과는 여전히 가격을 기준으로 정렬됩니다. 두 번째 SetSortMode() 호출은 첫 번째 쿼리에 영향을 미치지 않지만(이미 추가되었기 때문에) 다음 두 쿼리에는 영향을 미칩니다.

또한 AddQuery() 이전에 설정된 모든 필터링은 후속 쿼리에서 계속 사용됩니다. 따라서 첫 번째 쿼리 전에 SetFilter()를 사용하는 경우 필터링 규칙을 지우기 위해 ResetFilters()를 먼저 호출하지 않는 한 AddQuery()(및 후속 일괄 쿼리)를 통해 실행된 두 번째 쿼리에는 동일한 필터링이 적용됩니다. 동시에 언제든지 새로운 필터링 규칙을 추가할 수 있습니다.

AddQuery()는 현재 상태를 수정하지 않습니다. 즉, 기존의 모든 정렬, 필터링 및 그룹화 설정은 이 호출로 변경되지 않으므로 후속 쿼리에서 기존 설정을 쉽게 재사용할 수 있습니다.

AddQuery()는 RunQueries() 결과에서 반환된 배열의 인덱스를 반환합니다. 0부터 시작하는 증분 정수입니다. 즉, 첫 번째 호출은 0을 반환하고 두 번째 호출은 1을 반환하는 식입니다. 이 편리한 기능을 사용하면 필요할 때 아래 첨자를 수동으로 기록할 필요가 없습니다.

관련 권장 사항:

Yii2.0 PHP를 사용하는 Sphinx

PHP에서 스핑크스 검색 엔진을 사용하는 방법

PHP+Sphinx+Mysql 검색 엔진 개발에 대한 자세한 예시 설명

위 내용은 PHP 스핑크스의 간단한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.