Elasticsearch 6.5 +
我们正在寻找一种有效的查询来实现以下目标:
获取10个文档...
{'name': 'A', 'text': 'no relevancy', 'date': datetime(<24hrs old)},
{'name': 'B', 'text': 'relevancy ++', 'date': datetime(>24hrs old)},
{'name': 'C', 'text': 'relevancy ++++', 'date': datetime(>24hrs old)},
{'name': 'D', 'text': 'relevancy +++', 'date': datetime(<24hrs old)},
{'name': 'E', 'text': 'relevancy +', 'date': datetime(<24hrs old)},
{'name': 'F', 'text': 'relevancy +', 'date': datetime(>24hrs old)},
{'name': 'G', 'text': 'relevancy ++', 'date': datetime(<24hrs old)},
{'name': 'H', 'text': 'relevancy ++++', 'date': datetime(<24hrs old)},
{'name': 'I', 'text': 'no relevancy', 'date': datetime(>24hrs old)},
{'name': 'J', 'text': 'relevancy +++', 'date': datetime(>24hrs old)}
我们需要以下规则来保存查询结果,并按优先级排序:
分页应该正常工作,否则应该易于处理。
因此,查询将产生以下顺序:
{'name': 'H', 'text': 'relevancy ++++', 'date': datetime(<24hrs old)},
{'name': 'D', 'text': 'relevancy +++', 'date': datetime(<24hrs old)},
{'name': 'G', 'text': 'relevancy ++', 'date': datetime(<24hrs old)},
{'name': 'E', 'text': 'relevancy +', 'date': datetime(<24hrs old)},
{'name': 'A', 'text': 'no relevancy', 'date': datetime(<24hrs old)},
{'name': 'C', 'text': 'relevancy ++++', 'date': datetime(>24hrs old)},
{'name': 'J', 'text': 'relevancy +++', 'date': datetime(>24hrs old)},
{'name': 'B', 'text': 'relevancy ++', 'date': datetime(>24hrs old)},
{'name': 'F', 'text': 'relevancy +', 'date': datetime(>24hrs old)},
{'name': 'I', 'text': 'no relevancy', 'date': datetime(>24hrs old)}
大小为2的查询将返回:
{'name': 'G', 'text': 'relevancy ++', 'date': datetime(<24hrs old)},
{'name': 'E', 'text': 'relevancy +', 'date': datetime(<24hrs old)}
3(大小为5)的查询将返回:
{'name': 'E', 'text': 'relevancy +', 'date': datetime(<24hrs old)},
{'name': 'A', 'text': 'no relevancy', 'date': datetime(<24hrs old)},
{'name': 'C', 'text': 'relevancy ++++', 'date': datetime(>24hrs old)},
{'name': 'J', 'text': 'relevancy +++', 'date': datetime(>24hrs old)},
{'name': 'B', 'text': 'relevancy ++', 'date': datetime(>24hrs old)}
结果可以分为多个存储桶(只要通过在存储桶上循环就可以轻松解决分页)。例如,先前的查询可能会返回如下结果:
bucket 1: [
{'name': 'G', 'text': 'relevancy ++', 'date': datetime(<24hrs old)},
{'name': 'E', 'text': 'relevancy +', 'date': datetime(<24hrs old)}
]
bucket 2: []
和
bucket 1: [
{'name': 'E', 'text': 'relevancy +', 'date': datetime(<24hrs old)},
{'name': 'A', 'text': 'no relevancy', 'date': datetime(<24hrs old)},
]
bucket 2: [
{'name': 'C', 'text': 'relevancy ++++', 'date': datetime(>24hrs old)},
{'name': 'J', 'text': 'relevancy +++', 'date': datetime(>24hrs old)},
{'name': 'B', 'text': 'relevancy ++', 'date': datetime(>24hrs old)}
]
奖金:
结果的传递方式应使我们知道文档属于哪个日期范围,而不必对管道中的日期进行额外的计算。如果将结果分成多个桶,那么这很简单。如果不是,那么我们必须添加一些指标,例如,以键的形式:诸如“ new”之类的值对:为<24小时旧文档添加到_source的True。