| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
- <meta name="language" content="zh-cn" />
- <link rel="stylesheet" type="text/css" href="../api/css/style.css" />
- <link rel="stylesheet" type="text/css" href="../api/css/guide.css" />
- <link rel="stylesheet" type="text/css" href="../api/css/highlight.css" />
- <title>获取搜索结果</title>
- </head>
- <body>
- <div id="apiPage">
- <div id="apiHeader">
- <a href="http://www.xunsearch.com" target="_blank">Xunsearch PHP-SDK</a> v1.3.2 权威指南
- </div><!-- end of header -->
- <div id="content" class="markdown">
- <div class="toc"><ol><li><a href="#ch0">设置分页、数量</a></li><li><a href="#ch1">设置排序方式</a></li><li><a href="#ch2">读取搜索结果文档</a></li><li><a href="#ch3">搜索结果高亮处理</a></li><li><a href="#ch4">按字段值折叠搜索结果</a></li></ol></div><h1 id="-">获取搜索结果</h1>
- <p>获取搜索结果是进行搜索的最主要目的。通过 <a href="../api/XSSearch.html#search">XSSearch::search</a> 获得<a href="class.document.html">搜索结果文档</a>,
- 如果没有任何符合条件的匹配则会返回一个空数组。</p>
- <p>在获取搜索结果前您必须用<a href="search.query.html">上一章</a>学到的知识先构造好相应的搜索语句 <code>$query</code>。</p>
- <blockquote class="note">
- <p><strong>Note:</strong> 只有不带参数的 <a href="../api/XSSearch.html#search">XSSearch::search</a> 搜索调用才会将关键词记录搜索日志中去。</p>
- </blockquote>
- <h2 id="ch0">1. 设置分页、数量<a name="ch0" class="anchor">?</a></h2>
- <p>默认情况下,每次返回搜索结果的前 10 条数据,您可以通过 <a href="../api/XSSearch.html#setLimit">XSSearch::setLimit</a> 指定返回的条数及偏移量,
- 这样就可以实现分页搜索的效果。特别注意,每一次调用 <a href="../api/XSSearch.html#search">XSSearch::search</a> 后均会把这些设置恢复到默认值状态。</p>
- <div class="hl-code"><div class="php-hl-main"><pre><span class="php-hl-var">$search</span><span class="php-hl-code">-></span><span class="php-hl-identifier">setLimit</span><span class="php-hl-brackets">(</span><span class="php-hl-number">5</span><span class="php-hl-brackets">)</span><span class="php-hl-code">; </span><span class="php-hl-comment">//</span><span class="php-hl-comment"> 设置返回结果为前 5 条</span>
- <span class="php-hl-var">$search</span><span class="php-hl-code">-></span><span class="php-hl-identifier">setLimit</span><span class="php-hl-brackets">(</span><span class="php-hl-number">5</span><span class="php-hl-code">, </span><span class="php-hl-number">15</span><span class="php-hl-brackets">)</span><span class="php-hl-code">; </span><span class="php-hl-comment">//</span><span class="php-hl-comment"> 设置返回结果为 5 条,但要先跳过 15 条,即第 16~20 条。</span></pre></div></div>
- <h2 id="ch1">2. 设置排序方式<a name="ch1" class="anchor">?</a></h2>
- <p>默认情况,搜索结果根据内部算法计算相关度进行排序,采用著名的 <code>BM25</code> 算法,这在信息检索概率模型中表现
- 非常优秀,通常只要使用默认的算法即可。</p>
- <p>通过 <a href="../api/XSSearch.html#setSort">XSSearch::setSort</a> 我们可以指定让搜索结果按照某一个字段的值进行正序或倒序排列,参考代码:</p>
- <div class="hl-code"><div class="php-hl-main"><pre><span class="php-hl-var">$search</span><span class="php-hl-code">-></span><span class="php-hl-identifier">setSort</span><span class="php-hl-brackets">(</span><span class="php-hl-quotes">'</span><span class="php-hl-string">chrono</span><span class="php-hl-quotes">'</span><span class="php-hl-brackets">)</span><span class="php-hl-code">; </span><span class="php-hl-comment">//</span><span class="php-hl-comment"> 按 chrono 字段的值倒序</span>
- <span class="php-hl-var">$search</span><span class="php-hl-code">-></span><span class="php-hl-identifier">setSort</span><span class="php-hl-brackets">(</span><span class="php-hl-quotes">'</span><span class="php-hl-string">chrono</span><span class="php-hl-quotes">'</span><span class="php-hl-code">, </span><span class="php-hl-reserved">true</span><span class="php-hl-brackets">)</span><span class="php-hl-code">; </span><span class="php-hl-comment">//</span><span class="php-hl-comment"> 按 chrono 字段的值正序排列</span></pre></div></div>
- <p>自从 1.1.0 版本起,通过 <a href="../api/XSSearch.html#setMultiSort">XSSearch::setMultiSort</a> 可以实现按照多字段的值排序,
- 它接受一个数组参数用于表述排序的方式。以字段名称为键,用 true/false 值来表示是否需要正序排列,
- 默认为 false 表示逆序排列。参见以下代码:</p>
- <div class="hl-code"><div class="php-hl-main"><pre><span class="php-hl-comment">//</span><span class="php-hl-comment"> 表示先以 chrono 正序、再以 pid 逆序(pid 是字符串并不是数值所以 12 会排在 3 之后)</span>
- <span class="php-hl-var">$sorts</span><span class="php-hl-code"> = </span><span class="php-hl-reserved">array</span><span class="php-hl-brackets">(</span><span class="php-hl-quotes">'</span><span class="php-hl-string">chrono</span><span class="php-hl-quotes">'</span><span class="php-hl-code"> => </span><span class="php-hl-reserved">true</span><span class="php-hl-code">, </span><span class="php-hl-quotes">'</span><span class="php-hl-string">pid</span><span class="php-hl-quotes">'</span><span class="php-hl-code"> => </span><span class="php-hl-reserved">false</span><span class="php-hl-brackets">)</span><span class="php-hl-code">;
-
- </span><span class="php-hl-comment">//</span><span class="php-hl-comment"> 如果直接把字段名作为数组的值,默认对该字段采用逆序,因此以上用法和下面用法是完全一样的</span>
- <span class="php-hl-var">$sorts</span><span class="php-hl-code"> = </span><span class="php-hl-reserved">array</span><span class="php-hl-brackets">(</span><span class="php-hl-quotes">'</span><span class="php-hl-string">chrono</span><span class="php-hl-quotes">'</span><span class="php-hl-code">, </span><span class="php-hl-quotes">'</span><span class="php-hl-string">pid</span><span class="php-hl-quotes">'</span><span class="php-hl-code"> => </span><span class="php-hl-reserved">false</span><span class="php-hl-brackets">)</span><span class="php-hl-code">;
-
- </span><span class="php-hl-comment">//</span><span class="php-hl-comment"> 设置搜索排序</span>
- <span class="php-hl-var">$search</span><span class="php-hl-code">-></span><span class="php-hl-identifier">setMultiSort</span><span class="php-hl-brackets">(</span><span class="php-hl-var">$sorts</span><span class="php-hl-brackets">)</span><span class="php-hl-code">;</span></pre></div></div>
- <blockquote class="note">
- <p><strong>Note:</strong> 按字段值排序是一个低效能的行为,如非必要,强烈建议使用默认排序方式。
- 排序默认也是按照字节序比较,对于数字型的字段请将字段类型设为 <code>numeric</code>。</p>
-
- <p>为了兼容,您也可以把多字段排序的参数直接传递给 <a href="../api/XSSearch.html#setSort">XSSearch::setSort</a> 即可。</p>
- </blockquote>
- <h2 id="ch2">3. 读取搜索结果文档<a name="ch2" class="anchor">?</a></h2>
- <p>调用 <a href="../api/XSSearch.html#search">XSSearch::search</a> 后返回的是<a href="class.document.html">搜索结果文档对象</a>组成的数组,
- 您直接使用这些文档对象的属性即可。</p>
- <div class="hl-code"><div class="php-hl-main"><pre><span class="php-hl-comment">//</span><span class="php-hl-comment"> 以 demo 项目的配置为例</span>
- <span class="php-hl-var">$docs</span><span class="php-hl-code"> = </span><span class="php-hl-var">$search</span><span class="php-hl-code">-></span><span class="php-hl-identifier">setQuery</span><span class="php-hl-brackets">(</span><span class="php-hl-quotes">'</span><span class="php-hl-string">测试</span><span class="php-hl-quotes">'</span><span class="php-hl-brackets">)</span><span class="php-hl-code">-></span><span class="php-hl-identifier">setLimit</span><span class="php-hl-brackets">(</span><span class="php-hl-number">5</span><span class="php-hl-brackets">)</span><span class="php-hl-code">-></span><span class="php-hl-identifier">search</span><span class="php-hl-brackets">(</span><span class="php-hl-brackets">)</span><span class="php-hl-code">;
- </span><span class="php-hl-reserved">foreach</span> <span class="php-hl-brackets">(</span><span class="php-hl-var">$docs</span> <span class="php-hl-reserved">as</span> <span class="php-hl-var">$doc</span><span class="php-hl-brackets">)</span>
- <span class="php-hl-brackets">{</span>
- <span class="php-hl-comment">//</span><span class="php-hl-comment"> 其中常用魔术方法:percent() 表示匹配度百分比, rank() 表示匹配结果序号</span>
- <span class="php-hl-reserved">echo</span> <span class="php-hl-var">$doc</span><span class="php-hl-code">-></span><span class="php-hl-identifier">rank</span><span class="php-hl-brackets">(</span><span class="php-hl-brackets">)</span><span class="php-hl-code"> . </span><span class="php-hl-quotes">'</span><span class="php-hl-string">. </span><span class="php-hl-quotes">'</span><span class="php-hl-code"> . </span><span class="php-hl-var">$doc</span><span class="php-hl-code">-></span><span class="php-hl-identifier">subject</span><span class="php-hl-code"> . </span><span class="php-hl-quotes">"</span><span class="php-hl-string"> [</span><span class="php-hl-quotes">"</span><span class="php-hl-code"> . </span><span class="php-hl-var">$doc</span><span class="php-hl-code">-></span><span class="php-hl-identifier">percent</span><span class="php-hl-brackets">(</span><span class="php-hl-brackets">)</span><span class="php-hl-code"> . </span><span class="php-hl-quotes">"</span><span class="php-hl-string">%] - </span><span class="php-hl-quotes">"</span><span class="php-hl-code">;
- </span><span class="php-hl-reserved">echo</span> <span class="php-hl-identifier">date</span><span class="php-hl-brackets">(</span><span class="php-hl-quotes">"</span><span class="php-hl-string">Y-m-d</span><span class="php-hl-quotes">"</span><span class="php-hl-code">, </span><span class="php-hl-var">$doc</span><span class="php-hl-code">-></span><span class="php-hl-identifier">chrono</span><span class="php-hl-brackets">)</span><span class="php-hl-code"> . </span><span class="php-hl-quotes">"</span><span class="php-hl-special">\n</span><span class="php-hl-quotes">"</span><span class="php-hl-code"> . </span><span class="php-hl-var">$doc</span><span class="php-hl-code">-></span><span class="php-hl-identifier">message</span><span class="php-hl-code"> . </span><span class="php-hl-quotes">"</span><span class="php-hl-special">\n</span><span class="php-hl-quotes">"</span><span class="php-hl-code">;
- </span><span class="php-hl-brackets">}</span></pre></div></div>
- <h2 id="ch3">4. 搜索结果高亮处理<a name="ch3" class="anchor">?</a></h2>
- <p>根据搜索的习惯,通会希望让搜索结果中匹配关键词的部分进行飘红或加粗等高亮处理,
- 由于其中涉及到了分词等细节处理比较麻烦。因此,我们统一提供了 <a href="../api/XSSearch.html#highlight">XSSearch::highlight</a>
- 方法,可以对搜索结果文档中的字段值直接进行处理,匹配关键词部分会自动套上 <code>em</code> 标签。</p>
- <p>您只要在 <code>CSS</code> 中定义它即可实现自己的高亮代码。</p>
- <div class="hl-code"><div class="php-hl-main"><pre><span class="php-hl-var">$docs</span><span class="php-hl-code"> = </span><span class="php-hl-var">$search</span><span class="php-hl-code">-></span><span class="php-hl-identifier">setQuery</span><span class="php-hl-brackets">(</span><span class="php-hl-quotes">'</span><span class="php-hl-string">测试</span><span class="php-hl-quotes">'</span><span class="php-hl-brackets">)</span><span class="php-hl-code">-></span><span class="php-hl-identifier">setLimit</span><span class="php-hl-brackets">(</span><span class="php-hl-number">5</span><span class="php-hl-brackets">)</span><span class="php-hl-code">-></span><span class="php-hl-identifier">search</span><span class="php-hl-brackets">(</span><span class="php-hl-brackets">)</span><span class="php-hl-code">;
- </span><span class="php-hl-reserved">foreach</span> <span class="php-hl-brackets">(</span><span class="php-hl-var">$docs</span> <span class="php-hl-reserved">as</span> <span class="php-hl-var">$doc</span><span class="php-hl-brackets">)</span>
- <span class="php-hl-brackets">{</span>
- <span class="php-hl-var">$subject</span><span class="php-hl-code"> = </span><span class="php-hl-var">$search</span><span class="php-hl-code">-></span><span class="php-hl-identifier">highlight</span><span class="php-hl-brackets">(</span><span class="php-hl-var">$doc</span><span class="php-hl-code">-></span><span class="php-hl-identifier">subject</span><span class="php-hl-brackets">)</span><span class="php-hl-code">; </span><span class="php-hl-comment">//</span><span class="php-hl-comment"> 高亮处理 subject 字段</span>
- <span class="php-hl-var">$message</span><span class="php-hl-code"> = </span><span class="php-hl-var">$search</span><span class="php-hl-code">-></span><span class="php-hl-identifier">highlight</span><span class="php-hl-brackets">(</span><span class="php-hl-var">$doc</span><span class="php-hl-code">-></span><span class="php-hl-identifier">message</span><span class="php-hl-brackets">)</span><span class="php-hl-code">; </span><span class="php-hl-comment">//</span><span class="php-hl-comment"> 高亮处理 message 字段</span>
- <span class="php-hl-reserved">echo</span> <span class="php-hl-var">$doc</span><span class="php-hl-code">-></span><span class="php-hl-identifier">rank</span><span class="php-hl-brackets">(</span><span class="php-hl-brackets">)</span><span class="php-hl-code"> . </span><span class="php-hl-quotes">'</span><span class="php-hl-string">. </span><span class="php-hl-quotes">'</span><span class="php-hl-code"> . </span><span class="php-hl-var">$subject</span><span class="php-hl-code"> . </span><span class="php-hl-quotes">"</span><span class="php-hl-string"> [</span><span class="php-hl-quotes">"</span><span class="php-hl-code"> . </span><span class="php-hl-var">$doc</span><span class="php-hl-code">-></span><span class="php-hl-identifier">percent</span><span class="php-hl-brackets">(</span><span class="php-hl-brackets">)</span><span class="php-hl-code"> . </span><span class="php-hl-quotes">"</span><span class="php-hl-string">%] - </span><span class="php-hl-quotes">"</span><span class="php-hl-code">;
- </span><span class="php-hl-reserved">echo</span> <span class="php-hl-identifier">date</span><span class="php-hl-brackets">(</span><span class="php-hl-quotes">"</span><span class="php-hl-string">Y-m-d</span><span class="php-hl-quotes">"</span><span class="php-hl-code">, </span><span class="php-hl-var">$doc</span><span class="php-hl-code">-></span><span class="php-hl-identifier">chrono</span><span class="php-hl-brackets">)</span><span class="php-hl-code"> . </span><span class="php-hl-quotes">"</span><span class="php-hl-special">\n</span><span class="php-hl-quotes">"</span><span class="php-hl-code"> . </span><span class="php-hl-var">$message</span><span class="php-hl-code"> . </span><span class="php-hl-quotes">"</span><span class="php-hl-special">\n</span><span class="php-hl-quotes">"</span><span class="php-hl-code">;
- </span><span class="php-hl-brackets">}</span></pre></div></div>
- <blockquote class="note">
- <p><strong>Note:</strong> 这个方法不适合于快捷搜索,也就是说必须使用 <code>setQuery</code> 以及不带参数的 <code>search</code> 才有效。</p>
- </blockquote>
- <h2 id="ch4">5. 按字段值折叠搜索结果<a name="ch4" class="anchor">?</a></h2>
- <p>有时我们也反折叠搜索称为归并搜索,就像 <code>Google</code> 上通常搜索结果中对于某一个网站只会显示 2 条最匹配的结果,
- 其余的归并折叠起来。</p>
- <p>在 <code>Xunsearch</code> 中,通过 <a href="../api/XSSearch.html#setCollapse">XSSearch::setCollapse</a> 可以设置按照指定字段的值归并搜索结果,其中第二参数可以
- 指定归并后返回数量,默认为 1。对于这种情况,请在搜索结果文档中调用 <code>$doc->ccount()</code> 获取展开的全部匹配数。</p>
- <div class="hl-code"><div class="php-hl-main"><pre><span class="php-hl-comment">//</span><span class="php-hl-comment"> 表示搜索结果按 tid 字段的值归并,至多返回 1 条最匹配的数据</span>
- <span class="php-hl-var">$search</span><span class="php-hl-code">-></span><span class="php-hl-identifier">setCollapse</span><span class="php-hl-brackets">(</span><span class="php-hl-quotes">'</span><span class="php-hl-string">tid</span><span class="php-hl-quotes">'</span><span class="php-hl-brackets">)</span><span class="php-hl-code">;
-
- </span><span class="php-hl-comment">//</span><span class="php-hl-comment"> 然后正常进行搜索后得到的搜索结果文档</span>
- <span class="php-hl-var">$docs</span><span class="php-hl-code"> = </span><span class="php-hl-var">$search</span><span class="php-hl-code">-></span><span class="php-hl-identifier">search</span><span class="php-hl-brackets">(</span><span class="php-hl-brackets">)</span><span class="php-hl-code">;
-
- </span><span class="php-hl-reserved">foreach</span> <span class="php-hl-brackets">(</span><span class="php-hl-var">$docs</span> <span class="php-hl-reserved">as</span> <span class="php-hl-var">$doc</span><span class="php-hl-brackets">)</span>
- <span class="php-hl-brackets">{</span>
- <span class="php-hl-comment">//</span><span class="php-hl-comment"> 输出 $doc 的有关信息</span>
-
- <span class="php-hl-comment">//</span><span class="php-hl-comment"> 得出相同 tid 下还有多少条匹配信息</span>
- <span class="php-hl-reserved">echo</span> <span class="php-hl-quotes">'</span><span class="php-hl-string">该主是下还有 </span><span class="php-hl-quotes">'</span><span class="php-hl-code"> . </span><span class="php-hl-brackets">(</span><span class="php-hl-var">$doc</span><span class="php-hl-code">-></span><span class="php-hl-identifier">ccount</span><span class="php-hl-brackets">(</span><span class="php-hl-brackets">)</span><span class="php-hl-code"> - </span><span class="php-hl-number">1</span><span class="php-hl-brackets">)</span><span class="php-hl-code"> . </span><span class="php-hl-quotes">'</span><span class="php-hl-string"> 条匹配结果。</span><span class="php-hl-quotes">'</span><span class="php-hl-code">;
- </span><span class="php-hl-brackets">}</span></pre></div></div>
- <div class="revision">$Id$</div>
- <div class="clear"></div>
- </div><!-- end of content -->
- <div id="guideNav">
- <div class="prev"><a href="search.query.html">« 构建搜索语句</a></div>
- <div class="next"><a href="search.count.html">获取搜索匹配数量 »</a></div>
- <div class="clear"></div>
- </div><!-- end of nav -->
- <div id="apiFooter">
- Copyright © 2008-2011 by <a href="http://www.xunsearch.com" target="_blank">杭州云圣网络科技有限公司</a><br/>
- All Rights Reserved.<br/>
- </div><!-- end of footer -->
- </div><!-- end of page -->
- <div style="display:none;">
- <img src="../api/css/info.gif" />
- <img src="../api/css/tip.gif" />
- <img src="../api/css/note.gif" />
- </div>
- </body>
- </html>
|