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

在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)
####这个对中文搜索貌似没有什么卵用!

分享到QQ空间

Comments are closed.