<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>爱周末 &#187; sphinx</title>
	<atom:link href="http://zhoumo123.cn/category/sphinx/feed" rel="self" type="application/rss+xml" />
	<link>http://zhoumo123.cn</link>
	<description>知识分享，共同进步。zhoumo123.cn</description>
	<lastBuildDate>Thu, 07 Nov 2019 05:53:49 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.0.1</generator>
	<item>
		<title>sphinx Coreseek全文检索php实例代码api接口调用</title>
		<link>http://zhoumo123.cn/sphinx/2630.html</link>
		<comments>http://zhoumo123.cn/sphinx/2630.html#comments</comments>
		<pubDate>Mon, 04 May 2015 08:30:36 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[sphinx]]></category>
		<category><![CDATA[Coreseek]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=2630</guid>
		<description><![CDATA[在php全文检索应用中，我们用sphinx来实现全文检索，php如何使用sphinx-Coreseek来实现中文全文检索呢，一起看下sphinx Coreseek全文检索在php中的实例代码： 数据结构： coreseek/api目录下提供了PHP的接口文件 sphinxapi.php，这个文件包含一个SphinxClient的类 在PHP引入这个文件，new一下 $result是一个数组，其中 total是匹配到的数据总数量 matches是匹配的数据，包含id，attrs这些信息 words是搜索关键字的分词 你可能奇怪为什么没有邮件的内容这些信息，其实sphinx并不会返回像mysql那 ...  <a href="http://zhoumo123.cn/sphinx/2630.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>在php全文检索应用中，我们用sphinx来实现全文检索，php如何使用sphinx-Coreseek来实现中文全文检索呢，一起看下sphinx Coreseek全文检索在php中的实例代码：</p>
<p>数据结构：</p>
<p>
<pre class="brush: php; title: ; notranslate">&lt;/p&gt;
&lt;p&gt;CREATE TABLE email (&lt;br /&gt;
emailid mediumint(8) unsigned NOT NULL auto_increment COMMENT '邮件id',&lt;/p&gt;
&lt;p&gt;fromid int(10) unsigned NOT NULL default '0' COMMENT '发送人ID',&lt;/p&gt;
&lt;p&gt;toid int(10) unsigned NOT NULL default '0' COMMENT '收件人ID',&lt;br /&gt;
content text unsigned NOT NULL COMMENT '邮件内容',&lt;br /&gt;
subject varchar(100) unsigned NOT NULL COMMENT '邮件标题',&lt;/p&gt;
&lt;p&gt;sendtime int(10) NOT NULL COMMENT '发送时间',&lt;/p&gt;
&lt;p&gt;attachment varchar(100) NOT NULL COMMENT '附件ID，以逗号分割', PRIMARY KEY (emailid),&lt;br /&gt;
) ENGINE=MyISAM';&lt;/p&gt;
&lt;p&gt;</pre>
</p>
<p>coreseek/api目录下提供了PHP的接口文件 sphinxapi.php，这个文件包含一个SphinxClient的类</p>
<p>在PHP引入这个文件，new一下</p>
<p>
<pre class="brush: php; title: ; notranslate">&lt;br /&gt;
$sphinx = new SphinxClient();&lt;/p&gt;
&lt;p&gt;//sphinx的主机名和端口&lt;/p&gt;
&lt;p&gt;$sphinx-&amp;gt;SetServer ( 'loclahost', 9312 );&lt;/p&gt;
&lt;p&gt;//设置返回结果集为php数组格式&lt;/p&gt;
&lt;p&gt;$sphinx-&amp;gt;SetArrayResult ( true );&lt;/p&gt;
&lt;p&gt;//匹配结果的偏移量，参数的意义依次为：起始位置，返回结果条数，最大匹配条数&lt;/p&gt;
&lt;p&gt;$sphinx-&amp;gt;SetLimits(0, 20, 1000);&lt;/p&gt;
&lt;p&gt;//最大搜索时间&lt;/p&gt;
&lt;p&gt;$sphinx-&amp;gt;SetMaxQueryTime(10);&lt;/p&gt;
&lt;p&gt;//执行简单的搜索，这个搜索将会查询所有字段的信息，要查询指定的字段请继续看下文&lt;/p&gt;
&lt;p&gt;$index = 'email' //索引源是配置文件中的 index 类，如果有多个索引源可使用,号隔开：'email,diary' 或者使用'*'号代表全部索引源&lt;/p&gt;
&lt;p&gt;$result = $sphinx-&amp;gt;query ('搜索关键字', $index); &lt;/p&gt;
&lt;p&gt;print_r($result);&lt;/p&gt;
&lt;p&gt;</pre>
</p>
<p><strong>$result</strong>是一个数组，其中</p>
<p><strong>total</strong>是匹配到的数据总数量</p>
<p><strong>matches</strong>是匹配的数据，包含id，attrs这些信息</p>
<p><strong>words</strong>是搜索关键字的分词</p>
<p>你可能奇怪为什么没有邮件的内容这些信息，其实sphinx并不会返回像mysql那样的数据数组，因为sphinx本来就没有记录完整的数据，只记录被分词后的数据。</p>
<p>具体还要看matches数组，matches中的ID就是指配置文件中sql_query SELECT语句中的第一个字段，我们配置文件中是这样的</p>
<p>sql_query = SELECT emailid,fromid,toid,subject,content,sendtime,attachement FROM email</p>
<p>所以matches中的ID是指emailid</p>
<p>至于weight是指匹配的权重，一般权重越高被返回的优先度也最高，匹配权重相关内容请参考官方文档</p>
<p>attrs是配置文件中sql_attr_ 中的信息，稍后会提到这些属性的用法</p>
<p>说了这么多，即使搜索到结果也不是我们想要的email数据，但事实sphinx是不记录真实数据的，所以要获取到真实email数据还要根据matches中的ID去搜索mysql的email表，但总体来说这样一来一回的速度还是远远比mysql的LIKE快得多，前提是几十万数据量以上，否则用sphinx只会更慢。</p>
<p>接下来介绍sphinx一些类似mysql条件的用法</p>
<p>
<pre class="brush: php; title: ; notranslate">&lt;/p&gt;
&lt;p&gt;//emailid的范围&lt;/p&gt;
&lt;p&gt;$sphinx-&amp;gt;SetIdRange($min, $max); &lt;/p&gt;
&lt;p&gt;//属性过滤，可过滤的属性必需在配置文件中设置sql_attr_    ，之前我们定义了这些&lt;/p&gt;
&lt;p&gt;    sql_attr_uint            = fromid&lt;/p&gt;
&lt;p&gt;    sql_attr_uint            = toid&lt;/p&gt;
&lt;p&gt;    sql_attr_timestamp  = sendtime&lt;/p&gt;
&lt;p&gt;//如果你想再次修改这些属性，配置完成后记得重新建立索引才能生效&lt;/p&gt;
&lt;p&gt;//指定一些值&lt;/p&gt;
&lt;p&gt;$sphinx-&amp;gt;SetFilter('fromid', array(1,2));    //fromid的值只能是1或者2&lt;/p&gt;
&lt;p&gt;//和以上条件相反，可增加第三个参数&lt;/p&gt;
&lt;p&gt;$sphinx-&amp;gt;SetFilter('fromid', array(1,2), false);    //fromid的值不能是1或者2&lt;/p&gt;
&lt;p&gt;//指定一个值的范围&lt;/p&gt;
&lt;p&gt;$sphinx-&amp;gt;SetFilterRange('toid', 5, 200);    //toid的值在5-200之间&lt;/p&gt;
&lt;p&gt;//和以上条件相反，可增加第三个参数&lt;/p&gt;
&lt;p&gt;$sphinx-&amp;gt;SetFilterRange('toid', 5, 200, false);    //toid的值在5-200以外&lt;/p&gt;
&lt;p&gt;//执行搜索&lt;/p&gt;
&lt;p&gt;$result = $sphinx-&amp;gt;query('关键字', '*');&lt;/p&gt;
&lt;p&gt;</pre>
</p>
<p>排序模式<br />
可使用如下模式对搜索结果排序：</p>
<p>SPH_SORT_RELEVANCE 模式, 按相关度降序排列（最好的匹配排在最前面）</p>
<p>SPH_SORT_ATTR_DESC 模式, 按属性降序排列 （属性值越大的越是排在前面）</p>
<p>SPH_SORT_ATTR_ASC 模式, 按属性升序排列（属性值越小的越是排在前面）</p>
<p>SPH_SORT_TIME_SEGMENTS 模式, 先按时间段（最近一小时/天/周/月）降序，再按相关度降序</p>
<p>SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来，升序或降序排列。</p>
<p>SPH_SORT_EXPR 模式，按某个算术表达式排序</p>
<p>
<pre class="brush: php; title: ; notranslate">&lt;br /&gt;
//使用属性排序&lt;/p&gt;
&lt;p&gt;//以fromid倒序排序，注意当再次使用SetSortMode会覆盖上一个排序&lt;/p&gt;
&lt;p&gt;$sphinx-&amp;amp;gt;SetSortMode ( &amp;quot;SPH_SORT_ATTR_DESC&amp;quot;, 'fromid');&lt;/p&gt;
&lt;p&gt;//如果要使用多个字段排序可使用SPH_SORT_EXTENDED模式&lt;/p&gt;
&lt;p&gt;//@id是sphinx内置关键字，这里指emailid，至于为什么是emailid，自己思考一下&lt;/p&gt;
&lt;p&gt;$sphinx-&amp;amp;gt;SetSortMode ( &amp;quot;SPH_SORT_ATTR_DESC&amp;quot;, 'fromid ASC, toid DESC, @id DESC');&lt;/p&gt;
&lt;p&gt;//执行搜索&lt;/p&gt;
&lt;p&gt;$result = $sphinx-&amp;amp;gt;query('关键字', '*');&lt;/p&gt;
&lt;p&gt;</pre>
</p>
<p>//更多请查看官方文档排序模式的说明</p>
<p>匹配模式<br />
有如下可选的匹配模式：</p>
<p>SPH_MATCH_ALL, 匹配所有查询词(默认模式);</p>
<p>SPH_MATCH_ANY, 匹配查询词中的任意一个;</p>
<p>SPH_MATCH_PHRASE, 将整个查询看作一个词组，要求按顺序完整匹配;</p>
<p>SPH_MATCH_BOOLEAN, 将查询看作一个布尔表达式</p>
<p>SPH_MATCH_EXTENDED, 将查询看作一个CoreSeek/Sphinx内部查询语言的表达式 . 从版本Coreseek 3/Sphinx 0.9.9开始, 这个选项被选项SPH_MATCH_EXTENDED2代替，它提供了更多功能和更佳的性能。保留这个选项是为了与遗留的旧代码兼容——这样即使Sphinx及其组件包括API升级的时候，旧的应用程序代码还能够继续工作。</p>
<p>SPH_MATCH_EXTENDED2, 使用第二版的“扩展匹配模式”对查询进行匹配.</p>
<p>SPH_MATCH_FULLSCAN, 强制使用下文所述的“完整扫描”模式来对查询进行匹配。注意，在此模式下，所有的查询词都被忽略，尽管过滤器、过滤器范围以及分组仍然起作用，但任何文本匹配都不会发生.</p>
<p>我们要关注的主要是SPH_MATCH_EXTENDED2扩展匹配模式，扩展匹配模式允许使用一些像mysql的条件语句</p>
<p>
<pre class="brush: php; title: ; notranslate">&lt;br /&gt;
//设置扩展匹配模式&lt;/p&gt;
&lt;p&gt;$sphinx-&amp;gt;SetMatchMode ( &amp;quot;SPH_MATCH_EXTENDED2&amp;quot; );&lt;/p&gt;
&lt;p&gt;//查询中使用条件语句，字段用@开头，搜索内容包含测试，toid等于1的邮件：&lt;/p&gt;
&lt;p&gt;$result = $sphinx-&amp;gt;query('@content (测试) &amp;amp; @toid =1', '*');&lt;/p&gt;
&lt;p&gt;//用括号和&amp;amp;（与）、|、（或者）、-（非，即!=）设置更复杂的条件&lt;/p&gt;
&lt;p&gt;$result = $sphinx-&amp;gt;query('(@content (测试) &amp;amp; @subject =呃) | (@fromid -(100))', '*');&lt;/p&gt;
&lt;p&gt;//更多语法请查看官方文档匹配模式的说明&lt;/p&gt;
&lt;p&gt;</pre>
</p>
<p>原文：http://www.php100.com/html/php/lei/2013/0916/6188.html</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/sphinx/2630.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
