Elasticsearch查询按日期范围拆分并按文本匹配相关性排序

时间:2019-03-06 05:54:43

标签: elasticsearch

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)}

我们需要以下规则来保存查询结果,并按优先级排序:

  1. 比某个日期更新的文档(在这种情况下,假设文档<24小时)总是被提升到结果的最前面,无论它们的相关性如何。
  2. 在文本字段的查询中,文件以匹配相关性排序。

分页应该正常工作,否则应该易于处理。

因此,查询将产生以下顺序:

{'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。

0 个答案:

没有答案