内容简介:在Sphinx 2.3.2中,我们介绍了几个新功能,其中一个是修正建议。直到现在,对于suggests,需要遵循从索引字典中提取所有单词的过程,从单词创建三叉树,并将其插入到一个索引中,该索引将被查询以获得建议。这是一个痛苦的过程,因为它正在假设一些工作来创建建议索引和定期更新它,并在应用程序代码中进行后处理工作(比如应用在Levenshtein距离)。#
在Sphinx 2.3.2中,我们介绍了几个新功能,其中一个是修正建议。
直到现在,对于suggests,需要遵循从索引字典中提取所有单词的过程,从单词创建三叉树,并将其插入到一个索引中,该索引将被查询以获得建议。这是一个痛苦的过程,因为它正在假设一些工作来创建建议索引和定期更新它,并在应用程序代码中进行后处理工作(比如应用在Levenshtein距离)。
# 注 Levenshtein 距离,又称 编辑距离 ,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
现在不用了!在2.3.2中任何索引启用了中缀,它都可以执行一个查询,将给你一个类似的单词的列表。由于magic 在查询时间完成,因此不需要重新索引来使用新功能。
新功能在2个语句中实现: CALL QSUGGEST 和 CALL 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)
####这个对中文搜索貌似没有什么卵用!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- SQL Server On Linux(15)—— SQL Server On Linux性能(1)——内置特性(1)——内置扩展性
- Python 3.10 的首个 PEP 诞生,内置类型 zip() 将迎来新特性
- Python 3.10 的首个 PEP 诞生,内置类型 zip() 将迎来新特性
- sphinx search 2.3.2 版本一些新的特性 built-in suggests(内置搜索建议)
- SQL Server On Linux(16)—— SQL Server On Linux性能(2)——内置特性(2)——内存和Cache管理
- SQL Server On Linux(17)—— SQL Server On Linux性能(3)——内置特性(3)——I/O行为
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。