【发布时间】:2015-02-15 03:04:38
【问题描述】:
我有 3 个级别的父/子结构。比方说:
公司 -> 员工 -> 可用性
由于可用性(以及员工)在这里经常更新,我选择使用父/子结构来对抗嵌套。并且搜索功能工作正常(所有文档都在正确的分片中)。
现在我想对这些结果进行排序。按公司(第一级)的元数据对它们进行排序很容易。但我还需要按 3 级(可用性)排序。
我想要按以下方式排序的公司列表:
- 与指定 ASC 位置的距离
- 评级 DESC
- 最快可用 ASC
例如:
A 公司在 5 英里外,评级为 4,并且他们的一名员工最快在 20 小时内有空 B 公司也在 5 英里外,评级也为 4,但他们的一名员工最快在 5 小时内有空。
因此排序结果需要是B,A。
我想为每个数据附加特殊的权重,所以我开始编写聚合,以后可以在我的 custom_score 脚本中使用。
Full gist for creating index, importing data and searching
现在,我设法编写了一个实际返回结果的查询,但可用性聚合存储桶为空。
但是,我也得到了过于结构化的结果,我想将它们展平。
目前我回来了:
公司 IDS -> 员工 IDS -> 首次可用性
我想进行如下聚合:
公司 IDS -> 首次可用性
这样我就可以使用我的custom_score 脚本来计算分数并正确排序。
更简化的问题:
如何按多级(大)子级排序/聚合并可能使结果变平。
【问题讨论】:
-
您能否将您的映射和一些示例文档(带有后代)添加到要点中?很难看到如何发明能够对您的系统进行充分测试的虚假文档。
-
嘿 Sloan - 我添加了映射和示例结果。为了更容易理解,我已经把它剥离了一点。完整堆栈中包含更多数据:) 谢谢!
-
我有同样的问题here。尽管性能可能较差,但我只是请求所有具有默认类型 DocCount 的结果。然后我做了自己的递归展平、排序和限制,这并不理想。
-
我已经执行了你的要点,但是在搜索时我收到错误 500
Query Failed [Failed to execute main query]]; nested: NullPointerException;。你能在你的本地环境中执行你的要点并确保它没问题吗?谢谢! -
为什么不为您的结果创建方程式。你的数据不模糊!您汇总每个查询? .聚合是输入操作,而不是查询或输出。一个问题“你如何检查这个结果是真的(对)?”
标签: sorting elasticsearch aggregation