是否计划将 'OR' 添加到 Sphinx 中的属性搜索?
Are there plans to add 'OR' to attribute searches in Sphinx?
这个问题需要一些背景知识,因为它表面上太笼统了:
最近我 运行 遇到一个问题,我必须将我推送到我的 sphinxql 查询中的属性值作为全文移动,因为该属性需要成为 'OR' 查询的一部分。
换句话说我在做:
Select * from idx_test where MATCH('Terms') and name_id in (1,2,3)
当我尝试向属性添加 'OR' 时,例如:
Select * from idx_test where MATCH('Terms') and name_id in (1,2,3) OR customer_id in (4,5,6)
失败,因为 Sphinx 2.* 不支持属性查询中的 OR
。
我也无法简单地将姓名和客户 ID 放入查询中:
Select * from idx_test where MATCH('Terms ((@(name_id) 1|2|3)|(@customer_id) 4|5|6))')
因为(据我所知)您不能将整数字段推入 full_text 搜索。
我的解决方案是第二次索引 id 字段并附加 _text
:
Select name_id, name_id as name_id_text
然后将其添加到字段列表中:
sql_attr_uint = name_id
sql_field_string = name_id_text
sql_attr_uint = customer_id
sql_field_string = customer_id_text
所以现在我可以按 full_text:
进行 OR 查询
Select * from idx_test where MATCH('Terms ((@(name_id_text) 1|2|3)|(@customer_id_text) 4|5|6))')
不过最近我发现了一个 article,它讨论了属性搜索和全文搜索之间的权衡。结果就是"it could reduce performance of queries that otherwise match few records"。这正是我的 name_id/city_id 查询所做的。在一个理想的世界里,我可以回到:
Select * from idx_test where MATCH('Terms') and name_id in (1,2,3) OR customer_id in (4,5,6)
如果 Sphinx 只允许 OR
在属性之间,因为据我所知,一旦我有一个查询被过滤到相对较低的结果数量,我会有一个更快的查询使用属性 vs full_text.
所以我的两部分问题是:
- 事实是这样吗(一个可以显着减少结果数量的查询最好使用属性而不是全文)?
- 如果是,是否计划将
OR
添加到 SphinxQL 查询的属性部分?
- 如果是,什么时候?
虽然是,但WHERE中不直接支持OR,仍然可以运行查询。你的
Select * from idx_test where MATCH('Terms') and name_id in (1,2,3) OR customer_id in (4,5,6)
例子可以写成
Select *, IN(name_id,1,2,3) + IN(customer_id,4,5,6) as filter
from idx_test where MATCH('Terms') and filter > 0
有点麻烦,但应该可以。您仍然可以获得全文倒排索引的全部好处,因此性能实际上应该不会太差。 fitler 仅针对匹配条款的文档执行。
(这可能看起来很疯狂,如果来自说 mysql 背景,但记住 sphinxQL 不是 mysql :)
你不会短路(即 customer_id 过滤器,即使匹配 name_id,仍将是 运行,所以也许
Select *, IF(IN(name_id,1,2,3) OR IN(customer_id,4,5,6),1,0) as filter
from idx_test where MATCH('Terms') and filter =1
更好,if 函数有一个 OR 运算符! (因为狮身人面像可能会短路,但不知道它是否会短路)
(但也是,如果 'filter' 具有高度选择性(匹配几行),那么包含在全文查询中可能会很好。因为它在处理过程中较早地丢弃了行。问题是非选择性过滤器,它们是否有很多匹配行,因此在文本查询处理期间需要处理很长的文档列表)
OR 过滤器已添加到 Sphinx 分支(来自 2.3 分支)- Manticore,参见 https://github.com/manticoresoftware/manticore/commit/76b04de04feb8a4db60d7309bf1e57114052e298
目前只支持属性之间,OR MATCH和属性之间还不支持。
这个问题需要一些背景知识,因为它表面上太笼统了:
最近我 运行 遇到一个问题,我必须将我推送到我的 sphinxql 查询中的属性值作为全文移动,因为该属性需要成为 'OR' 查询的一部分。
换句话说我在做:
Select * from idx_test where MATCH('Terms') and name_id in (1,2,3)
当我尝试向属性添加 'OR' 时,例如:
Select * from idx_test where MATCH('Terms') and name_id in (1,2,3) OR customer_id in (4,5,6)
失败,因为 Sphinx 2.* 不支持属性查询中的 OR
。
我也无法简单地将姓名和客户 ID 放入查询中:
Select * from idx_test where MATCH('Terms ((@(name_id) 1|2|3)|(@customer_id) 4|5|6))')
因为(据我所知)您不能将整数字段推入 full_text 搜索。
我的解决方案是第二次索引 id 字段并附加 _text
:
Select name_id, name_id as name_id_text
然后将其添加到字段列表中:
sql_attr_uint = name_id
sql_field_string = name_id_text
sql_attr_uint = customer_id
sql_field_string = customer_id_text
所以现在我可以按 full_text:
进行 OR 查询Select * from idx_test where MATCH('Terms ((@(name_id_text) 1|2|3)|(@customer_id_text) 4|5|6))')
不过最近我发现了一个 article,它讨论了属性搜索和全文搜索之间的权衡。结果就是"it could reduce performance of queries that otherwise match few records"。这正是我的 name_id/city_id 查询所做的。在一个理想的世界里,我可以回到:
Select * from idx_test where MATCH('Terms') and name_id in (1,2,3) OR customer_id in (4,5,6)
如果 Sphinx 只允许 OR
在属性之间,因为据我所知,一旦我有一个查询被过滤到相对较低的结果数量,我会有一个更快的查询使用属性 vs full_text.
所以我的两部分问题是:
- 事实是这样吗(一个可以显着减少结果数量的查询最好使用属性而不是全文)?
- 如果是,是否计划将
OR
添加到 SphinxQL 查询的属性部分? - 如果是,什么时候?
虽然是,但WHERE中不直接支持OR,仍然可以运行查询。你的
Select * from idx_test where MATCH('Terms') and name_id in (1,2,3) OR customer_id in (4,5,6)
例子可以写成
Select *, IN(name_id,1,2,3) + IN(customer_id,4,5,6) as filter
from idx_test where MATCH('Terms') and filter > 0
有点麻烦,但应该可以。您仍然可以获得全文倒排索引的全部好处,因此性能实际上应该不会太差。 fitler 仅针对匹配条款的文档执行。 (这可能看起来很疯狂,如果来自说 mysql 背景,但记住 sphinxQL 不是 mysql :)
你不会短路(即 customer_id 过滤器,即使匹配 name_id,仍将是 运行,所以也许
Select *, IF(IN(name_id,1,2,3) OR IN(customer_id,4,5,6),1,0) as filter
from idx_test where MATCH('Terms') and filter =1
更好,if 函数有一个 OR 运算符! (因为狮身人面像可能会短路,但不知道它是否会短路)
(但也是,如果 'filter' 具有高度选择性(匹配几行),那么包含在全文查询中可能会很好。因为它在处理过程中较早地丢弃了行。问题是非选择性过滤器,它们是否有很多匹配行,因此在文本查询处理期间需要处理很长的文档列表)
OR 过滤器已添加到 Sphinx 分支(来自 2.3 分支)- Manticore,参见 https://github.com/manticoresoftware/manticore/commit/76b04de04feb8a4db60d7309bf1e57114052e298
目前只支持属性之间,OR MATCH和属性之间还不支持。