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 的所有可能组合中为该术语编制索引。例如:
- 变体 1:
part1-part2.part3
- 变体 2:
part1 part2.part3
- 变体 3:
part1-part2 part3
- 变体 4:
part1 part2 part3
然而,情况似乎并非如此。
如果我搜索:
part2.part3
我没有找到包含术语 part1-part2.part3
的记录。
但是,如果我搜索:
part2 part3
或
part1 part2 part3
我确实找到了记录。
这向我表明,Sphinx 并未索引 blend_chars 的所有可能组合。相反,它似乎只索引了两个版本:
part1-part2.part3
(blend_chars 完整)
part1 part2 part3
(忽略 blend_chars,视为空格)
如果为真,我会认为这是一个错误,因为它往往会破坏仅使用 blend_chars.
之一的搜索
任何人都可以确认他们看到了相同的行为吗?谁能就如何修复或解决它提出建议?
非常感谢!
当您有 blend_chars = ., -
和 search 用于 part2.part3
或 part1-part2
时,Sphinx 将它们保留为单个标记,它不会转换它们至 part2 AND part3
和 part1 AND part2
.
但是当你 index part1-part2.part3
它会生成 4 个标记:part1-part2.part3
、part1
、part2
和 part3
.这就是为什么您无法使用 part1-part2
或 part2.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)
我正在使用 Sphinx 2.2.11,我相信我发现了一个关于 Sphinx 如何索引包含多个混合字符实例的术语的错误。
例如,我将连字符和句点设置为 blend_chars:
blend_chars = ., -
假设我在数据库中有一个术语如下:
part1-part2.part3
我预计 Sphinx 会在每个 blend_char 的所有可能组合中为该术语编制索引。例如:
- 变体 1:
part1-part2.part3
- 变体 2:
part1 part2.part3
- 变体 3:
part1-part2 part3
- 变体 4:
part1 part2 part3
然而,情况似乎并非如此。
如果我搜索:
part2.part3
我没有找到包含术语 part1-part2.part3
的记录。
但是,如果我搜索:
part2 part3
或
part1 part2 part3
我确实找到了记录。
这向我表明,Sphinx 并未索引 blend_chars 的所有可能组合。相反,它似乎只索引了两个版本:
part1-part2.part3
(blend_chars 完整)part1 part2 part3
(忽略 blend_chars,视为空格)
如果为真,我会认为这是一个错误,因为它往往会破坏仅使用 blend_chars.
之一的搜索任何人都可以确认他们看到了相同的行为吗?谁能就如何修复或解决它提出建议?
非常感谢!
当您有 blend_chars = ., -
和 search 用于 part2.part3
或 part1-part2
时,Sphinx 将它们保留为单个标记,它不会转换它们至 part2 AND part3
和 part1 AND part2
.
但是当你 index part1-part2.part3
它会生成 4 个标记:part1-part2.part3
、part1
、part2
和 part3
.这就是为什么您无法使用 part1-part2
或 part2.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)