在Sphinx 2.3.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) |