首页 SEO攻略 正文

搜索技巧:简单搜索语句构建及高亮折叠效果学习要点

SEO攻略 2025-10-03 2

搜索技巧(一)简单搜索语句构建及高亮折叠效果

学习完索引管理相关内容后,我们进入到搜索技巧相关学习,实际上在XS中就是SDK里XSSearch对象的相关学习与使用,同样在此部分我们会普及诸多搜索相关知识。

事实上,针对这个XSSearch对象,我们并非感到陌生,在先前的诸多次数中,于许多不同的地方,均已然使用过它了,只是我们全都仅仅运用了其最为简单的某一种使用方式 。

它会返回一个数组,这个数组是由 XSDocument 对象组合而成的,想必对应这部分内容,我也无需做过量解释 。

其实,在 XSSearch 的 search() 方法上面直接书写搜索用词,这乃是 XS 给我们予以的一种快捷搜索方式。这个 search() 方法实际的功用是朝着查询服务端,也就是端口 8383 发送查询指令,并且借助它所继承的 XSServer 里的 respond 取得返回的成果。关于 XSServer 部分的内容先前都已然学习过了。这里也就不再过多叙述了。

真正正式的,具备将查询语句以及查询词进行设置功能的方法,实际上就是那个被称为setQuery()的方法 。

新创建了一个名为$xs的XS对象,该对象关联的路径是、位于config文件夹下的zyarticle.ini文件,此文件作为其参数被传递给。
$search等于$xs的search属性所得的值;在后期的情景之中,倘若运用直接书写一个$search作为表达情况,那么其确切寓意就是直接指向通过对$xs的 $search属性进行相关操作从而从中获得到的专属某个状况下特有着意义或者功能的XSSearch对象来得出的最终那个$search所处特定运算得出那样状态关联于所述后续流程或者体系下可明确到所特定的$  search所具备的相应指代情况结果 //这后面只是对语义基于拗口做解释填充句子不然真按格式要求语义易混乱这里核心意义在保持形式将原本意思填充进句式搞拗口 。
在变量$search上调用setQuery办法并传入参数'敏捷',之后再调用search办法,最后使用print_r函数输出结果。

事实上它的成效跟 $search->search("敏捷"); 是相同的。那么要是我们一同运用 setQuery() ,并且 search() 里面也存在搜索词,并且两个词并非一样时会产生什么状况呢?

$search 进行设置查询的动作,此番指定以“敏捷”作为查询内容,之后开展针对“算法”的搜索行为;

诸位能够自行去打印一回结果尝试一下,而我这儿乃是运用返回查询数量的一个属性去开展测试的。

使搜索对象进行搜索操作,搜索的内容为敏捷 ;
显示印出(变量$search的最后计数);// 37
你提供的这句话包含代码内容,不太符合单纯进行语言改写的要求,你可以提供一个纯文本的句子让我进行改写。
对$search的lastCount属性值 使用print_r函数进行输出操作 该属性值为63 。
$search->setQuery('敏捷')->search('算法');
print_r($search->lastCount); // 63
使用$search来专门设置查询并限定为1000条,其以‘敏捷’作为查询条件,接着去搜索‘算法’,最后将其结果进行print_r输出,而此输出所呈现的乃是与算法相关的数据 。

能够看到,最终返回的结果数目为63条,这意味着,最终用以查询的词汇是以search()的参数作为标准的。大家能够运行最后一行的程序代码以便查看返回的结果是否为63条。

从这个地方进行源码分析,setQuery()会把参数经由XS_CMD_QUERY_PARSE这个命令常量直接发送至服务端,此查询参数会直接在服务端保存。而后search()拥有参数时,则会以其自身参数沿着 XS_CMD_SEARCH_GET_RESULT这个查询命令标识直接展开查询,例如我们再依此言进行测试:

$search->setLimit(1000);$search->search();print_r();它所打印出来的是与敏捷存在关联的数据

没有 setQuery() ,然后 search() 也不存在参数,其返回的结果是上一次 setQuery() 所设置的查询内容,此内容为 “敏捷” 相关的 37 条数据。

这两段代码里头,我们运用了一个 setLimit() 方法,此方法乃是 XS 里的分页方法,接下来,我们去瞧一瞧该分页的效果。

分页

在默认情形下,我们并不添加 setLimit() 方法,如此一来,那最终的 search() 便会默认返回起始于第 0 条数据的 10 条数据,亦即默认就是第一页的十条数据,这与 MySQL 里的 limit 没存在较大差异,其中第一个参数是返回的数量,而第二个参数属于 offset 偏移量。

先设置限制为两条,之后进行搜索,搜索内容为空字符串,最后使用print_r输出结果,此操作返回两条数据 。
 ,假如有变量来替代这部分代码逻辑 ,先设置限制是从第一条数据时把从第一条数据时这一条数据给跳过进而获取在第一条被跳过的数据之后的那一条数据 ,然后开展的就是搜索的操作 ,最后打印出搜索结果 。  // 返回跳过第一条数据之后的一条数据

没什么太多能够用于解释的吧 。然而 ,此处需要再多说一句 。涵盖 ES 之内的大多数搜索引擎针对深分页的支持状况都不太理想 。什么被称作深分页呢 ?就好比每页展示 10 条数据 ,接着呈现到第 1000 页 、第 10000 页往后的内容 。在默认情形下 ,ES 的分页仅仅支持 10000 条数据 ,这意味着 ,要是每页十条数据 ,于 ES 里 ,最多直接划分 1000 页 。当然也存在其他途径能够继续向下进行翻页 ,但是不可以支持跳页了 (也就是直接指定页码 )。

搜索引擎会针对查询结果开展分析,进行打分,实施计算,这一块的原因实则如此。所以分页之际常常会把数据全都取回来开展这些计算操作。倘若数据量过大,即便 ES 也承受不住,毕竟它能够将数据分片存储,然而最后分页进行打分、排序时依旧要把所有分片上的数据一并取过来进行总体计算。基于这般原因,它便硬性规定了最多仅能处理 10000 条数据。

虽说XS的文档上面没写,然而基于对大部分搜索引擎的理解,其中包括百度和Google,搜索引擎对于深分页的支持都不太对劲。就拿百度来说,最多也就到100页左右,大家能够尝试直接访问百度超过100页之后的内容呈现出的样子。

用以链接网络资源的网址,其具体内容为https://www.baidu.com/s,所查询的特定关键词为wd,该关键词所对应的值为PHP 。
这个链接https://www.baidu.com/s?wd=PHP&pn=750 ,就我在进行测试期间,是能够实现搜索到76页这种情况的 。
https://www.baidu.com/s?wd=PHP&pn=760,#,试着去看看,访问那第77页,会是怎样的一种效果,句号

但实际上,就算仅仅是中文网页,我坚信关键词里有 “PHP” 的文章乃至网站,远远超过 700 多条搜索结果。这意味着,搜索引擎实际上不需要全面,并且有时候也不需要绝对的精准,真正的搜索引擎,需要的是找出契合用户需求的内容。所以,千万别认为百度、Google 养的成百上千工程师是白拿工资的。真正商业化的全网搜索引擎的技术要求,比我们学习的诸如 ES、XS 这类工具复杂得多。

不过,XS 未曾提及过此问题,那么,咱们开展测试,采用默认的 demo 吧 。

// php
$xs = new XS("demo");
$xs->index->openBuffer();
for($i=100000;$i>=1;$i--){
你提供的内容似乎并不是一个完整的、通顺的句子,从这段代码片段来看,这样改写可能不是很符合正常语言习惯,不过按照需求改写如下:$xs推及的index进行更新,借助新的XSDocument,此XSDocument内含[
将“pid”赋值为,“pid”与“$i”进行拼接 ,。
这似乎是一段无法有效改写为恰当且符合要求表述的非正常文本信息,仅从这“'subject'=>'sub'.$i”本身看其格式像是某种代码等表述,强行改写可能会失去其原本含义,暂试着改为“'标目''变为''副''与变量我'依次''关联结成一起”,但这可能并非合适用途下正规通顺含义表达,如果这不是你想要类型结果,请你补充更多背景说明以便更准确处理 。不过原始表述“'subject'=>'sub'.$i”,很疑并非完整准确的普通语句来让按规定去改写 。请确认下具体需求是否准确准确告知 。若仍按现有语句改写就是这样了:“'标目''呈现为''副''与变量我'依次''关联结成一起,” 。
'message' 被设定为'msg'加上变量 "$i" 的值,
  ]));
}
$xs->index->closeBuffer();
对于php,执行vendor/hightman/xunsearch/util/Quest.php,要进行--show-query操作,并且设置--limit为20000,10,针对演示demo,输入为空字符串 "" 。

启用PHP编码,朝着索引里面增添十万个数条,接着借助SDK给出的工具程序,运用 --limit 参数来实施分页,能够目睹最终的成效是能够顺畅返回20000跟20010条数据的列表,看起来XS对这个深度分页的支撑还行,而且响应的速度也还可以。当然,ES 存在其自身的缘由与道理,于此我只不过是多说上那么一句,这并不意味着 XS 比它厉害或者如何,仅仅是借助测试证实,XS 能够针对超出 10000 条以上的数据开展深分页处理 。

快捷数量查询

查询数量,就如同 MySQL 里 count(*) 的那种效果。于 XS 而言,前面我们已然看到 lastCount 属性的运用。它将返回毗邻之前那次查询结果的数量的值,这属于一个属性,所以与之对应的存在一个 getLastCount() 方法。但此属性不存在与 set 沾边的方法,借由这种方式可知,这类变量属性属于只读变量。是不是感受到面向对象里封装所带来的益处了呢?

这种返回最后一次查询结果数量的属性及对应的方法之外,如同上面的search()方法那般,XS为我们提供了一个快捷获得指定查询条件数量的方法,此方法名为count() 。

对$search指向的具有能执行count方法的对象,执行count方法,并将结果以print_r函数进行打印显示为37个,
这段代码不是一个普通的句子,无法按照要求进行改写。请提供其他合适的句子让我进行改写操作。
print_r($search->count()); // 37

不传任何参数时,count() 返回的结果,是上回查询关键词的结果数量,但是它也可以指定一个查询参数,如同第二行那样,然而大家会发现,第三行又变回之前的查询结果数量了,其实呀,这个查询对于查询参数的处理情况,和 search() 一模一样,如果给出了参数,那就按照参数的情况来,如果没有给出参数,那就按照上一次 setQuery() 方法所指定的查询条件来。

先前我们讲过,setQuery() 是把查询参数径直传递至服务端的,search() 与 count() 的参数均是现拼凑出的。要是它们存在参数,便依据最新的这个查询参数来开展执行操作。这个直接用于执行的查询参数,在服务端是不会留存的,存在于服务端被保留的,是经由 setQuery() 设置的、命令常量为 XS_CMD_QUERY_PARSE 的数据。同样的,直接给予count()的参数,是针对这一次请求的,其与search()的效果,完全一样。

还有一点是需要另外去留意的内容所示状况,则眼下 count() 方法所回应回来那般得出到数量体现范畴并不是为准确之数值结果,反而是属于经大致评估之后所得到的数值所在范围方面内容表征。与之同样存在着呈现情况类似的是,可以说明lastCount 属性这项内容及其跟对应的方法两者相互契合情况下产出所相应到数量方面情况所反馈回来的数据数值方面内容同样是属于大致评估一下过后所获得到的数值范围参考区间类别成果结论类别事物情况表征阐述,并非就是精准无误进行完整无误无误情况准确无误程度表现的精准数值内容类别。而这般状况之下,这究竟又是怎样一种概念诠释内容指代所代表情况表征方面情况呈现呢?

倘若存在做过大数据量的日志方面统计。例如流量统计。又或者是类似统计系统情形。要么倘若有深分页之际达到100页以上情况者当中的部分同学习惯知晓。有的时候。着眼于性能方面考量。我们所拥有的汇总数据值依据实际情形能够不必呈现出精确的状态。比如说在千万条日志里头在进行统计操作时所获取到的关于实时日活数量这一数据。其误差处于一定范围之内从常规理解角度讲实际上都是能够得到认可并且被看作是合理的。涵盖了之前我们学习过的Redis里的HyperLogLog本身就清晰表明了不具备精确性这一特质。也就是它存在着多少误差的状况。然而它在运行工作过程中速度是极为快速顺畅的。同时其在存储空间占用方面是比较小的。同样的,对于大部分搜索结果,就其分页而言,本身分词存在不确定性,存在异步索引操作方面的问题,数量统计会因这些情况产生不准确的问题。

ES里count效果通常借助聚合aggs来达成,相对来讲会精确好些,然而这是以更多计算以及资源消耗量作为代价而换来的,不过它并非绝对精确值,特别是在采用多分片分布式情形下,同样存在误差率,不过它能够凭借一些参数设置去调节精确度 ,依旧是那句话,依据业务需求来进行取舍。

索引项目总数量

最后还有一个索引项目内的文档总数量的属性。

输出$search当中_db总数量呢,这个数值是339。这儿“输出”字样为print_r ,且数据所指是_db总数量,它处在$search里 。数值为339

这没什么好多说的,它存在一个与之相对应的 getDbTotal() ,不存在 set 相关的方法,属于一个只读的属性。对于这个数量值是不是精确的,文档未作说明,我们也并不清楚。

链式调用

因着先前的学习,实际上大伙已然察觉到,XS的SDK里的各类操作皆能够予以链式调用。针对此种调用方式,之前于建造者模式、Laravel数据库关联的学习之中我们全都讲过了。在这儿简略地阐述一下X S里的应用。

在XS里,XSSearch对象除去search()以及count()这两项之外,和查询有联系的别的方法都是能够展开链式调用的。实际上,XSIndex也是这样的,之前咱们曾见到过,add()还有update()这些方法全都是返回XSIndex其自身,所以绝对能够如此去书写。

(元素选择器集合)选择的首个元素的索引属性,添加一个值,添加另一个值,添加又一个值;

XS search技巧_XS search方法详解_seo高级搜索指令

不过相对而言,在进行增加操作时,我们会追求尽量达到原子化,也就是一行一行地写;在进行删除操作时,亦是如此,会追求尽量实现原子化,即一行一行地书写;在进行修改操作时,同样这般,会追求尽量做到原子化,就是一行一行地去写。如此一来,逻辑会更为清晰,也会更加容易让人看明白,并且同时还符合日常的认知 。

而对于搜索来说,这样链式的写就完全不违和了。

$xs,使其进行搜索,设置查询语句为:'敏捷',设置限制数量为1000,对'算法'进行搜索;

这样写是不是要比下面这样的写法清晰很多。

$search = $xs->search;
把查询内容设置为,“敏捷”,这个操作通过名为$search的对象来进行,借助其setQuery方法落实 。(不过由于实在难以达到非专业领域也超级拗口难读的程度,所以只能在逻辑表述等稍微做些调整,可能和预期有一定差距) 。
$search->setLimit(1000);
$search->search('算法');

高亮与折叠效果

大家使用百度亦或Google, 使用诸多网站搜索功能之际,会发觉于返回结果内,搜索关键字会被标红。此功能于XS里实现极为简单。实则自行实现亦不复杂,简言之原理便是将分词后的查询关键字逐个替换,添加上一个特殊HTML标签。而后于前端经由给此标签设定特定CSS样式,达成变红、加粗、改字体等功能即可。

于 XS 里头,径直运用 XSSearch 所给予的 highlight() 方法便行了。

$search->setLimit(1),$search->search('数据结构与算法'),$doc = $search->search('数据结构与算法')[0];
echo,$search,调用其highlight方法,传递参数为,$doc,的title属性,所得到的结果,标点符号为分号
// PHP数据结构算法1】在学数据结构算法的时候我们究竟学的是啥?
echo PHP_EOL;
把$search的highlight方法应用到$doc的content上然后发出echo
echo PHP_EOL; //………………

有看出效果了吧 , “数据结构与算法” 经默认分词实际状是分成了 “数据结构” 、 “数据” 、 “结构” 、 “与” 、 “算法” 这几个词 。 接着调用 highlight , 把一个字符串 ( 通常便是我们的 title 和 body 指定的字段 ) 传递给它 , 它便会依据分词的结果为指定字符添加上 标签 。 随后在前台展示之际 , 我们能够借助 CSS 来对标签展示样式实行控制了 。大家能够自行实地去查看一下源码,替换的整个过程确实并非是较为复杂,仅仅是用以获取分词以及组合起来替换规则的那一部分会稍微麻烦些许,其原理仍是我在上面曾经讲述过的那个原理,甚至最终所运用的函数就是 PHP 原装的 preg_replace()、strtr()、str_replace() 这三者中的其中一个。

它存有第二个参数,该参数为布尔类型的值,此值所表达是,是否借助strtr()函数推行替换处置 。

调用echo函数,输出$search调用highlight函数的结果,该highlight函数的参数为$doc的title属性,以及布尔值true;
// PHP数据结构算法1】在学数据结构算法的时候我们究竟学的是啥?
echo PHP_EOL;
输出,变量搜索之所指的,突出显示,文档之所指的,内容,真值;
echo PHP_EOL;  // ………………

能发觉不一样的所在之处明了了吧,上边儿的“数据结构”套了两轮 ,另外还有一轮是把“数据”和“结构体”划分开来的 。然而下面的仅仅存在一轮完整的长词语“数据结构” 。关乎strtr() and str_replace()的差异以及运用方式 ,大伙能够自行去查找相关的资料 。

此外,search()方法的第二个参数,用于表明是否将此次分词后的成果保存至高亮变量里,以便在后续的高亮处理中使用 。

对$search进行设置,设置其限制为获取最小单个数量,之后进行搜索,搜索内容为 '敏捷 ',搜索结果里存在一项;这一项被赋值给$doc 。
echo $search->highlight($doc->title);
// 【敏捷1.4】敏捷开发环境:领导团队
echo PHP_EOL;

那么就如同上面所提到的那般,我们在最后进行search()的调用,把第二个参数设定为false,这就意味着此次分词的具体内容,也就是关于“敏捷”的这个词,不会被用于后续的高亮操作,而该高亮缓存里面的分词内容依旧是上一次的内容。所以,在下方进行高亮效果调用的时候,恰好仅仅是针对标题当中出现的“与”字实施了高亮操作。

那要将之前高亮缓存里的分词内容给删除,该如何去操作呢?直接运用空字符串进行一次搜索就行啦。

$search,将其限制设置为1,接着输入两个单引号,对其进行搜索。
echo $search->highlight($doc->title);
// 【敏捷1.4】敏捷开发环境:领导与团队
echo PHP_EOL;

折叠

什么是折叠的意思呢,事实上呀,具体是类似于数据库进行操作时 GROUP 所产生的效果那般。折叠搜索被称作归并搜索,如同在 Google 上平常搜索结果里针对于某一个网站仅仅会呈现出两条最为匹配的结果,剩余的那些则进行归并并折叠起来。以便能够防止一个网站权重过大,连续好多页展示的全都是同一个网站的内容。

在 XS 里,能够经由 XSSearch 的 setCollapse() 把特定字段的值用作指定折叠归并的依据存在。它的首个设定参数是特意指定的字段称呼选取,第二个是设定用的数量值设定,也就是折叠合并的情况条件表示,或者说分组之后的情况呈现意味,这一组内部包含着多少文档数量情况在存,这个具体的对应数量值是借助返回结果当中 XSDocument 对象的实际ccount 属性去得以成功取得获取使用的存在。

说了半天,直接看例子吧,一看你就明白。

我无法按照你的要求进行改写,因为你提供的内容包含代码片段,代码有其特定的语法和规则,不适合进行这样目的的改写,且代码中的特定符号和表述在非代码语境中作这样的处理会失去其原本意义和规范性。
foreach ($docs as $doc)
{
输出,'分类:'.这个文档对象的分类名称。.' 下有 '.(与这个文档对象相关的计数加一)。.' 条匹配结果。',PHP换行符。
}
// 分类:PHP 下有 287 条匹配结果。
// 分类: 下有 1 条匹配结果。
// 分类: 下有 1 条匹配结果。
// 分类:随笔 下有 2 条匹配结果。
// 分类:项目产品 下有 48 条匹配结果。

看出效果了吧?咱们再用数据对应的 SQL 语句来试下。

计算数量,从zy_articles_xs_test中按照类别名进行分组,选取类别名,统计总数
-- 287 PHP
-- 2 
-- 2 随笔
-- 49 项目产品

结果恰好与之对应相符了吧。然而这里存在两个问题,其一,分类为空白的内容,于 XS 折叠之时,是以各自成为两个空的数据进行统计得出的。其二,官方文档采取的是 utilise ccount() - 1 这一方式,表示在当前分类里边,除去已然显示出来的这篇文档之外,尚有多少篇文档存在。但我的相应测试表明,并不需要减去 1,其本身所呈现的便是排除当前这篇文档之后的文档数量,所以在我的结果之中(我所统计的乃是该分类下总的数量 ),还得额外加上 1 。

进行折叠搜索之际,是能够组合别的搜索条件的,诸位是能够尝试一番的,此处就不予以演示了。

有一种是后面要学习的分面搜索,这对于那种聚合运算功能来说,除此之外就没别的了。要是想要更复杂的聚合功能,不用想别的,直接使用 ES 就行。

典型搜索步骤

在 XS里的搜索进程,实际上也是能够划分成不一样的步骤的,如同在 MySQL 里那样,我们可以直接不添加任何语句的进行一行 SELECT ,还能够添加 WHERE ,添加 ORDER BY ,添加 LIMIT ,添加 GROUP BY ,添加 HAVING 等等 。在这一系列步骤之中,同样存在先后次序 ,比如说 GROUP BY 的要求是比较多的 。

而在 XS 中,类似的过程也是有的:

这些内容就是我们后面要继续深入学习的具体内容了。

总结

第一篇文章进入搜索部分,其内容相对简单。我们设置查询条件,有着分页操作,还有查询数量方面的设置,以及高亮、折叠这些功能方法的运用。我们体会到链式调用的好处和效果。最后,提到一个典型的搜索步骤应是怎样的。这直接引出我们下一篇将要学习的内容。

好了,言语不再繁多赘述,即刻迅速开展练习,随后便着手准备步入更为深入的搜索技巧学习进程之中吧。

测试代码:

参考文档:

想赚钱却不知咋开始?这10个靠谱搬砖项目适合普通人
« 上一篇 2025-10-03
什么是SEO搜索引擎优化?它旨在提高网站自然搜索排名
下一篇 » 2025-10-03

文章评论