• 分面搜索
分面搜索对于现代搜索应用程序来说,与自动完成、拼写校正和搜索关键词高亮显示同样重要,尤其是在电子商务产品中。

当处理大量数据和各种相互关联的属性(如尺寸、颜色、制造商或其他因素)时,分面搜索非常有用。查询大量数据时,搜索结果往往包含许多不符合用户预期的条目。分面搜索使终端用户能够明确定义他们希望搜索结果满足的条件。
在 Manticore Search 中,有一种优化机制,它保持原始查询的结果集,并在每次计算分面时重新使用它。由于聚合应用于已计算的文档子集,因此它们的速度很快,总执行时间通常仅比初始查询稍长。可以将分面添加到任何查询中,分面可以是任何属性或表达式。分面结果包括分面值和分面计数。可以通过在查询的最后声明分面,在 SQL SELECT 语句中访问分面。
聚合
SQL
分面值可以来源于属性、JSON 属性内的 JSON 属性或表达式。分面值也可以使用别名,但别名必须在所有结果集(主查询结果集和其他分面结果集)中唯一。分面值是从聚合的属性或表达式中得出的,但也可以来自其他属性或表达式。
多个分面声明必须用空格分隔。
HTTP JSON
可以在 aggs 节点中定义分面:
其中:
group name是分配给聚合的别名field值必须包含正在进行分面的属性或表达式的名称可选的
size指定结果中包含的最大桶数。如果未指定,则继承主查询的限制。更多详细信息可以在 分面结果大小 部分找到。可选的
sort指定属性和/或附加属性数组,语法与主查询中的 "sort" 参数相同。
结果集将包含一个带有返回分面的 aggregations 节点,其中 key 是聚合值,doc_count 是聚合计数。
SQL:
JSON:
PHP:
Python:
Javascript:
Java:
C#:
通过聚合另一个属性进行分面
可以通过对另一个属性或表达式进行聚合来进行分面。例如,如果文档同时包含品牌 ID 和名称,我们可以在分面结果中返回品牌名称,但聚合的是品牌 ID。可以通过使用 FACET {expr1} BY {expr2} 来实现。
SQL:
无重复分面
如果需要从 FACET 返回的桶中移除重复项,可以使用 DISTINCT field_name,其中 field_name 是你想要进行去重的字段。如果你在对分布式表进行 FACET 查询且不确定表中的 ID 是否唯一(表应是本地的并且具有相同的架构),它也可以是 id(这是默认值)。
如果在查询中有多个 FACET 声明,field_name 应该在所有声明中保持一致。
DISTINCT 会在 count(*) 列之前返回一个额外的列 count(distinct ...),这样你可以在不需要另一个查询的情况下获取两种结果。
SQL:
表达式上的分面
分面可以聚合表达式。一个经典的例子是通过特定的范围对价格进行分段:
多级分组上的分面
分面可以在多级分组上进行聚合,其结果集与执行多级分组查询时的结果相同:
在直方图值上进行分面
分面可以通过构造固定大小的区间来对直方图值进行聚合。关键函数为:
直方图参数 interval 必须为正数,参数 offset 必须为正数且小于 interval。默认情况下,区间以数组形式返回。使用 keyed 参数可以使响应变为一个包含区间键的字典。
在直方图日期值上进行分面
分面可以对日期值直方图进行聚合,类似于普通直方图。区别在于间隔是使用日期或时间表达式指定的。这类表达式需要特殊支持,因为时间间隔不总是固定长度的。值将通过以下键函数四舍五入到最近的区间:
直方图参数 calendar_interval 能够理解不同月份的天数不同。可接受的时间间隔描述在 date_histogram 表达式中。默认情况下,区间以数组形式返回。使用 keyed 参数可以使响应变为一个包含区间键的字典。
在一组范围上进行分面
分面可以对一组范围进行聚合。值将根据区间范围进行检查,每个区间包括 from 值,但排除 to 值。 将 keyed 属性设置为 true 时,响应将变为一个包含区间键的字典,而不是数组。
在一组日期范围上进行分面。
分面可以对一组日期范围进行聚合,类似于普通的范围聚合。不同之处在于,from 和 to 值可以使用 日期运算 表达式来表示。此聚合包括每个范围的 from 值,排除 to 值。将 keyed 属性设置为 true 时,响应将变为一个包含区间键的字典,而不是数组。
分面结果的排序
分面支持类似于标准查询的 ORDER BY 子句。每个分面可以有自己的排序,分面的排序不会影响主结果集的排序,主结果集的排序由主查询的 ORDER BY 确定。排序可以基于属性名称、计数(使用 COUNT(*)),或者使用特殊的 FACET() 函数,该函数提供聚合后的数据值。默认情况下,带有 ORDER BY COUNT(*) 的查询将按降序排列。
SQL:
JSON:
分面结果的大小
默认情况下,每个分面结果集限制为 20 个值。可以通过 LIMIT 子句单独控制每个分面的分面值数量,格式可以是 LIMIT count 返回一定数量的值,或使用偏移量格式 LIMIT offset, count。
最大可返回的分面值数量受查询的 max_matches 设置限制。如果你想实现动态的 max_matches(将 max_matches 限制为偏移量 + 每页数量以提高性能),需要注意的是,过低的 max_matches 值可能会影响分面值的数量。在这种情况下,应使用足够覆盖分面值数量的最小 max_matches 值。
SQL:
返回的结果集
使用 SQL 进行带分面的搜索时,会返回多个结果集。所使用的 MySQL 客户端/库/连接器 必须 支持多个结果集,才能访问分面结果集。
性能
在内部,FACET 是执行多查询的简写,其中第一个查询包含主要的搜索查询,批次中的其余查询则分别进行聚类。与多查询情况类似,分面搜索的查询优化可以生效,意味着搜索查询只执行一次,分面基于搜索查询结果进行操作,每个分面仅增加一小部分时间到总查询时间。
要检查分面搜索是否以优化模式运行,可以查看 查询日志,所有已记录的查询中都会包含一个 xN 字符串,其中 N 是在优化组中运行的查询数量。或者,你可以检查 SHOW META 语句的输出,其中会显示一个 multiplier 指标:
最后更新于