当前位置: 首页 > 面试题库 >

在Elasticsearch中在多个日期上具有多个范围的查询

燕琨
2023-03-14
问题内容

以下range_query返回预期结果:

{"query": {
    "bool": {
      "must": [
        {
          "range": {
            "created_at": {
              "gte": "2013-12-09"
            }
          }
        }
      ]
    }
  }
}

但是,与多个范围查询一起,则不会返回任何内容:

{"query": {
    "bool":{
      "must": [
        {
          "and": [
            {
              "range": {
                "created_at": {
                  "gte": "2013-12-09"
                }
              }
            },
            {
              "range": {
                "happens_on": {
                  "lte": "2013-12-16"
                }
              }
            },
            {
              "range": {
                "created_at": {
                  "lte": "2013-12-14"
                }
              }
            }
          ]
        }
      ]
    }
  }
}

在多个字段上使用多个range_queries的正确方法是什么?

编辑:
啊,好的,所以这是我使用range_filter而不是range_query的地方?这听起来很有希望,所以我仅使用一个范围过滤器重新编写了查询。如果我在其他地方弄乱了查询,请在此处发布所有内容。我正在执行GET,并且源密钥中的所有内容实际上都是JSON,但是为了便于阅读,我删除了转义的连字符:

{
  "source": {
    "filtered": {
      "filter": {
        "and": [
          {
            "term": {
              "restricted": false
            }
          },
          {
            "not": {
              "term": {
                "deleted": true
              }
            }
          },
          {
            "range": {
              "happens_on": {
                "lte": "2013-12-16"
              }
            }
          }
        ]
      },
      "query": {
        "bool": {
          "must": [
          ]
        }
      }
    },
    "from": 0,
    "size": 10
  }
}

遗憾的是,我的问题仍然存在:我没有得到任何成功。

EDIT2: 因此,沿着Njal建议的must子句中的范围的小巷走下去。这给了我这样的多范围查询:

{
  "source": {
    "filter": {
      "and": [
        {
          "term": {
            "restricted": false
          }
        },
        {
          "not": {
            "term": {
              "deleted": true
            }
          }
        }
      ]
    },
    "from": 0,
    "query": {
      "bool": {
        "must": [
          {
            "range": {
              "happens_on": {
                "gte": "2013-12-06"
              }
            }
          },
          {
            "range": {
              "created_at": {
                "gte": "2013-12-15"
              }
            }
          },
          {
            "range": {
              "happens_on": {
                "lte": "2013-12-17"
              }
            }
          },
          {
            "range": {
              "created_at": {
                "lte": "2013-12-17"
              }
            }
          }
        ]
      }
    },
    "size": 10
  }
}

仍然没有结果返回。我在这里犯任何明显的错误吗?


问题答案:

bool查询must子句下,无需将其包装在中and。没有and查询,也许您在考虑and过滤器?

为了方便起见,将示例可运行播放作为curl命令:

#!/bin/bash

export ELASTICSEARCH_ENDPOINT="http://localhost:9200"

# Create indexes

curl -XPUT "$ELASTICSEARCH_ENDPOINT/play" -d '{
    "settings": {},
    "mappings": {
        "type": {
            "properties": {
                "created_at": {
                    "type": "date",
                    "format": "dateOptionalTime"
                },
                "name": {
                    "type": "string"
                },
                "happens_on": {
                    "type": "date",
                    "format": "dateOptionalTime"
                }
            }
        }
    }
}'


# Index documents
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d '
{"index":{"_index":"play","_type":"type"}}
{"name":"foo","created_at":"2013-12-09T00:00:00.000Z","happens_on":"2013-12-16T00:00:00.000Z"}
{"index":{"_index":"play","_type":"type"}}
{"name":"bar","created_at":"2013-12-08T00:00:00.000Z","happens_on":"2013-12-16T00:00:00.000Z"}
{"index":{"_index":"play","_type":"type"}}
{"name":"bar","created_at":"2013-12-09T00:00:00.000Z","happens_on":"2013-12-17T00:00:00.000Z"}
'

# Do searches

curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "created_at": {
                            "gte": "2013-12-09T00:00:00.000Z"
                        }
                    }
                },
                {
                    "range": {
                        "happens_on": {
                            "lte": "2013-12-16T00:00:00.000Z"
                        }
                    }
                }
            ]
        }
    }
}
'


 类似资料:
  • 问题内容: 我凝视着监视器已经太久了,不要问:我如何使用 Elastic Search PHP库* 执行 多个范围查询 ? * 我正在尝试根据 价格 标准(小于或大于)和类别内的 产品数量 (最少2个产品,仅2个产品,等等)查询我的索引。 虽然单独工作正常,但结合 我正在努力找到一个不错的近期示例,该示例涵盖ES v0.9之后的此场景,但在我的v1.4.2上却失败了。 问题答案: 您的回答是正确的

  • 问题内容: 我想在JCalendar上禁用多个日期范围。我正在按照以下步骤操作,但是我需要知道如何添加多个日期评估器。请帮助我,谢谢。 更新:我不知道为什么我不能禁用JCalendar上的日期。我将把代码留在这里,以便大家检查。 这是我的RangeEvaluator类,从该类修改而来。 这是我使用RangeEvaluator类的方式: 我想念什么吗?请帮助我,谢谢。 问题答案: 根据您的更新,这里

  • > 每个对象表示一个重复发生的事件。该事件可以在多个日期发生。因此,请考虑以下内容: 我有一个日历在客户端,用户可以选择一个日期范围。 > 对所选日期范围的每个条目进行调用,并在客户端处理聚合。问题是会有大量的读取,因为我们会多次读取重叠的日期范围内的同一个列表对象。 尝试使用类似ElasticSearch/Algolia的服务来完成此操作 任何建议都会很有帮助!

  • 问题内容: 我存储的文档包含两个字段,即startDate和endDate。我想使用输入日期运行Elastic查询,并返回其startDate和endDate包含该日期的所有文档。例如, 如果我输入的日期为2015-01-02,则此文档应出现在结果中,因为输入的日期在开始日期和结束日期字段的范围内。 我可以使用一个字段进行范围查询,但由于范围仅接受一个,因此我不知道如何使用两个日期字段: 我还需要

  • 在Crystal Reports中,我使用以下查询(针对Oracle数据库)为报表中的单个字段生成数据: 这可以很好地工作,并基于提供的{HB_As_At_Date}(the{?}语法是Crystal将参数值嵌入SQL(SQL)的方法。不过,上述查询的内容不是我的问题——我想做的是在几个不同的日期重复运行它,并将输出输入Crystal以供在报告中使用。 假设我希望在9月的每个星期一运行这个查询,我

  • 问题内容: 如果我有一个像这样的桌子 我如何才能像这样退货… 我正在考虑做的一件事是让另一个具有全部日期的表,然后使用和将仅具有日期的表加入到上述表中,但这似乎有点笨拙,因为除了重复的日期外,别无其他维护该表的必要性。 在某些情况下,我没有数据范围,而只有一个日期,基本上看起来像我的第一个示例,但没有。该由下一行的“作为”日暗示(即结束日期应该是下一行的-1)。为此,我有一个“解决方案”,它使用r