sphinx search 2.3.2 版本一些新的特性 built-in suggests(内置搜索建议)

栏目: 编程工具 · 发布时间: 6年前

内容简介:在Sphinx 2.3.2中,我们介绍了几个新功能,其中一个是修正建议。直到现在,对于suggests,需要遵循从索引字典中提取所有单词的过程,从单词创建三叉树,并将其插入到一个索引中,该索引将被查询以获得建议。这是一个痛苦的过程,因为它正在假设一些工作来创建建议索引和定期更新它,并在应用程序代码中进行后处理工作(比如应用在Levenshtein距离)。#

在Sphinx 2.3.2中,我们介绍了几个新功能,其中一个是修正建议。

直到现在,对于suggests,需要遵循从索引字典中提取所有单词的过程,从单词创建三叉树,并将其插入到一个索引中,该索引将被查询以获得建议。这是一个痛苦的过程,因为它正在假设一些工作来创建建议索引和定期更新它,并在应用程序代码中进行后处理工作(比如应用在Levenshtein距离)。

# 注  Levenshtein 距离,又称 编辑距离 ,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

现在不用了!在2.3.2中任何索引启用了中缀,它都可以执行一个查询,将给你一个类似的单词的列表。由于magic 在查询时间完成,因此不需要重新索引来使用新功能。

新功能在2个语句中实现: CALL QSUGGESTCALL SUGGEST。

CALL QSUGGEST/SUGGEST

查询需要2个参数,首先是我们要搜索的字,第二个是我们执行它的本地索引。

两个调用之间的差异在第一个参数,它可以接受一个单词或一串词。在单个字的情况下,在2个calls之间没有差别。

如果第一个参数是一串词:

CALL SUGGEST– 只处理第一个字,忽略其余的

CALL QSUGGEST– 只处理最后一个字,忽略其余部分

* QSUGGEST可能会在将来收到一个更新,以便能够处理输入的所有单词,而不仅仅是最后一个。

除了前2个参数之外,可以设置许多参数来调整建议或输出。

看下面的例子:

MySQL [(none)]> CALL QSUGGEST('automaticlly ','forum');
+---------------+----------+------+
| suggest       | distance | docs |
+---------------+----------+------+
| automatically | 1        | 282  |
| automaticly   | 1        | 6    |
| automaticaly  | 1        | 3    |
| automagically | 2        | 14   |
| automtically  | 2        | 1    |
+---------------+----------+------+
5 rows in set (0.00 sec)

查询返回一个结果,每行有3列:suggest,distance和docs。

距离列是在字典中找到的输入词和词之间的Levenshtein距离(因此不需要像以前那样进行后处理)。

docs列表示找到该单词的文档数。

词语按距离升序排序。 具有相同距离的词按文档数量降序排序。 最好的选择应该是结果的第一个单词。

你必须记住,该函数使用索引字典中找到的词。 如果存在拼写错误的单词,结果可能不是预期的结果。

让我们举两个例子。 第一个有输入字正确,但请记住,这是下一个最好的选择有更多的文档。 遵循正常路径,我们仍然选择第一个词’苹果’ – 因为它是预期的结果。

MySQL [(none)]> CALL QSUGGEST('apple','forum');
+---------+----------+------+
| suggest | distance | docs |
+---------+----------+------+
| apple   | 0        | 65   |
| apply   | 1        | 343  |
| apples  | 1        | 8    |
| ample   | 1        | 5    |
| appli   | 1        | 2    |
+---------+----------+------+
5 rows in set (0.00 sec)

MySQL [(none)]>

In the second case, our input word is bad, however it has several occurrences in the index, so it appears in the first row.

在第二种情况下,我们的输入字是错误的(comand,其实应该是command),但它在索引中有多次出现,因此它出现在第一行。

MySQL [(none)]> CALL QSUGGEST('comand','forum');
+----------+----------+------+
| suggest  | distance | docs |
+----------+----------+------+
| comand   | 0        | 3    |
| command  | 1        | 1248 |
| coomand  | 1        | 1    |
| coming   | 2        | 263  |
| commands | 2        | 225  |
+----------+----------+------+
5 rows in set (0.00 sec)

遵循正常路径,我们应该选择第一个字,输入字,这当然是坏的。 发动机不能在两种情况之间产生差异,因为他们似乎对他都是正确的。 如果我们想要处理这种情况,我们应该向用户返回下一个具有下一个最短距离和最大文档的词 – 在这种情况下,它是正确的单词’command’。

以下是可选参数

limit– 返回前N个匹配项,默认值为5。

max_matches- 与查询max_matches类似,它定义要保留的匹配字数。 默认值为25.增加max_matches可以增加查询时间。

result_stats- 它允许禁用显示距离和文档统计。 默认情况下启用。

result_line- 如果设置,它将打印所有建议,距离和文档在一行中。

MySQL [(none)]> CALL QSUGGEST('apple','forum',1 as result_line);
+----------+-------------------------------+
| name     | value                         |
+----------+-------------------------------+
| suggests | apple,apply,apples,ample,appl |
| distance | 0,1,1,1,1                     |
| docs     | 75,385,10,5,3                 |
+----------+-------------------------------+
3 rows in set (0.00 sec)

max_edits–定义了原始词和建议词之间的最大Levenshtein距离的限制。 默认值为4。

MySQL [(none)]>  call suggest('segmentaton','forum', 10 as limit,4 as max_edits);
+---------------+----------+------+
| suggest       | distance | docs |
+---------------+----------+------+
| segmentation  | 1        | 95   |
| segmenation   | 2        | 1    |
| segementation | 2        | 1    |
| segmental     | 3        | 1    |
| fragmentation | 4        | 24   |
| segmented     | 4        | 10   |
| segmenting    | 4        | 6    |
| segmenter     | 4        | 3    |
| doumentation  | 4        | 1    |
| segregation   | 4        | 1    |
+---------------+----------+------+
10 rows in set (0.01 sec)

MySQL [(none)]>call suggest('segmentaton','forum', 10 as limit,3 as max_edits);
+---------------+----------+------+
| suggest       | distance | docs |
+---------------+----------+------+
| segmentation  | 1        | 95   |
| segmenation   | 2        | 1    |
| segementation | 2        | 1    |
| segmental     | 3        | 1    |
+---------------+----------+------+
4 rows in set (0.01 sec)

delta_len –定义原始单词和建议单词之间的最大字符距离。 默认值为3。

MySQL [(none)]> call suggest('segmentaton','forum', 10 as limit,2 as delta_len);
+--------------+----------+------+
| suggest      | distance | docs |
+--------------+----------+------+
| segmentation | 1        | 95   |
| segmenation  | 2        | 1    |
| segmenting   | 4        | 6    |
| doumentation | 4        | 1    |
| segregation  | 4        | 1    |
+--------------+----------+------+
5 rows in set (0.01 sec)

####这个对中文搜索貌似没有什么卵用!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

订阅

订阅

[美] 罗伯特·金奇尔、马尼·佩伊万 / 中信出版集团 / 2018-12 / 68.00元

数据显示,年轻人现在每天看视频的时间已经超过电视。YouTube 平台每天的视频观看总时长超过10亿小时,这个数字还在增长。数字视频牢牢占据着人们的注意力。 数字时代如何实现创意变现?视频平台如何提升自己的品牌认知和广告号召力?想要在这个庞大的媒体生态中占据流量入口,你需要先了解 YouTube。在过去的10年里,互联网视频平台 YouTube 已经像60多年前的电影、广播和电视的发明一样,......一起来看看 《订阅》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码