gpt4 book ai didi

elasticsearch - 在Elasticsearch中合并范围和匹配项

转载 作者:行者123 更新时间:2023-12-03 02:30:45 25 4
gpt4 key购买 nike

我在Elasticsearch索引中具有以下结构的文档:

{
"title": 'Nutrtional facts',
"begin_timestamp" : 1582686052,
"end_timestamp" : 1582686093
}

{
"title": 'Guitar facts',
"begin_timestamp" : 1447991100,
"end_timestamp" : 1447994100
}

{
"title": 'Hair style facts',
"begin_timestamp" : 1447991100,
"end_timestamp" : 1447994100
}

{
"title": 'Piano facts',
"begin_timestamp" : 1554416211,
"end_timestamp" : 1591308724
}

我的目标是检索标题与 facts匹配且开始或结束时间戳大于当前日期和时间的文档。
title matches `facts` && begin_timestamp > CURRENT_DATE_TIME OR end_timestamp > CURRENT_DATE_TIME

我正在运行的当前查询如下:
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "facts"
}
}
],
"should": [
{
"range": {
"begin_timestamp_for_search": {
"gte": 1580853917
}
}
},
{
"range": {
"begin_timestamp_for_search": {
"gte": 1580853917
}
}
}
]
}
}
}

但是,这匹配匹配 facts的所有内容,并返回所有文档,无论时间戳在当前日期和时间之前还是之后。我对ES相当陌生,想知道如何编写查询,因此返回的唯一文档是:
{
"title": 'Nutrtional facts',
"begin_timestamp" : 1582686052,
"end_timestamp" : 1582686093
}

{
"title": 'Piano facts',
"begin_timestamp" : 1570227141,
"end_timestamp" : 1591308724
}

最佳答案

您的代码段中有一些小的错别字,您需要将should-子句包装到另一个bool -query中,然后将其添加/移动到must子句中。

解决方案(已通过ES 7.5.x验证)

POST my_index/_bulk
{"index": {}}
{"title": "Nutrtional facts", "begin_timestamp": 1582686052, "end_timestamp": 1582686093}
{"index": {}}
{"title": "Guitar facts", "begin_timestamp": 1447991100, "end_timestamp": 1447994100}
{"index": {}}
{"title": "Hair style facts", "begin_timestamp": 1447991100, "end_timestamp": 1447994100}
{"index": {}}
{"title": "Piano facts", "begin_timestamp": 1554416211, "end_timestamp": 1591308724}


GET my_index/_search
{
"query": {
"bool": {
"must": [
{"match": {"title": "facts"}},
{"bool": {
"should": [
{"range": {"begin_timestamp": {"gte": 1580853917}}},
{"range": {"end_timestamp": {"gte": 1580853917}}}
]
}}
]
}
}
}

注释1:解决方案片段上方的代码修复了代码片段中的拼写错误:
  • 在文档和查询
  • 中使用不同的字段名
  • 针对相同的begin_timestamp -field
  • 两次查询

    注释2:不需要 "minimum_should_match": 1,因为这是仅由 bool-子句组成的 should -query的默认行为。

    提示:最好将时间戳建模为 date类型的字段。这样您就可以使用日期数学(例如查询中的 now)。内部Elasticsearch会将您的日期存储为epoch_in_millis。

    关于elasticsearch - 在Elasticsearch中合并范围和匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60066467/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com