Sphinx 搜索:在单个术语中处理多个 blend_chars 时出现错误?

Sphinx search: bug in handling multiple blend_chars in a single term?

我正在使用 Sphinx 2.2.11,我相信我发现了一个关于 Sphinx 如何索引包含多个混合字符实例的术语的错误。

例如,我将连字符和句点设置为 blend_chars:

blend_chars = ., -

假设我在数据库中有一个术语如下:

part1-part2.part3

我预计 Sphinx 会在每个 blend_char 的所有可能组合中为该术语编制索引。例如:

然而,情况似乎并非如此。

如果我搜索:

part2.part3

我没有找到包含术语 part1-part2.part3 的记录。

但是,如果我搜索:

part2 part3

part1 part2 part3

我确实找到了记录。

这向我表明,Sphinx 并未索引 blend_chars 的所有可能组合。相反,它似乎只索引了两个版本:

  1. part1-part2.part3(blend_chars 完整)
  2. part1 part2 part3(忽略 blend_chars,视为空格)

如果为真,我会认为这是一个错误,因为它往往会破坏仅使用 blend_chars.

之一的搜索

任何人都可以确认他们看到了相同的行为吗?谁能就如何修复或解决它提出建议?

非常感谢!

当您有 blend_chars = ., -search 用于 part2.part3part1-part2 时,Sphinx 将它们保留为单个标记,它不会转换它们至 part2 AND part3part1 AND part2.

但是当你 index part1-part2.part3 它会生成 4 个标记:part1-part2.part3part1part2part3.这就是为什么您无法使用 part1-part2part2.part3.

找到它们的原因

解决方案是不要在查询中使用混合字符。如果你想自动化它,你可以使用 CALL KEYWORDS 查看它在搜索查询之前的索引期间如何被标记化,然后使用结果来修改你的查询,例如:

mysql> call keywords('part1-part2.part3', 'blend');
+------+-------------------+-------------------+
| qpos | tokenized         | normalized        |
+------+-------------------+-------------------+
| 1    | part1-part2.part3 | part1-part2.part3 |
| 1    | part1             | part1             |
| 2    | part2             | part2             |
| 3    | part3             | part3             |
+------+-------------------+-------------------+
4 rows in set (0.00 sec)