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

在带有Should子句的Elasticsearch中使用SearchTemplate进行日期范围查询

叶卓君
2023-03-14
问题内容

我们有一种情况,我们必须使用“ OR”条件进行范围查询。使用一个查询,它工作正常,但是使用多个查询触发时出错。

POST _scripts/dateTemplate
{
  "script": {
    "lang": "mustache",
    "source": """
        {
        "query": {
            "bool": {
                "must": {
                "query_string": {
                    "query": "title:({{searchkeyword}})"
                }
            },
            "filter": {
                "bool":{
                    "must":[
                        {
                            "match_all": {}
                        }
                        {{#f_url}} , {
                            "terms" : {
                                "f_url": [{{#toJson}}f_url{{/toJson}} ]
                                }
                            }
                        {{/f_url}}
                    ],
                    "should":[
                        {{#since}}
                            {
                                "range": {
                                    "{{since}}": {
                                        {{#from}}"from": "{{from}}"{{#to}},{{/to}}{{/from}}
                                        {{#to}}"to":"{{to}}"{{/to}}
                                    }
                                }
                            }
                        {{/since}}
                    ]
                }
            }
        }
    }
    }
"""
  }
}

调用模板时查询

POST _search/template
{
  "id": "dateTemplate",
  "params": {
    "searchkeyword": "*",
    "since":[ {
      "since":"@timestamp",
      "from": "2018-06-01"
    },
     {
      "since":"@timestamp",
      "from": "2018-06-08"
    }
    ]
  }
}

错误

{
  "error": {
    "root_cause": [
      {
        "type": "json_parse_exception",
        "reason": "Unexpected character ('{' (code 123)): was expecting comma to separate Array entries\n at [Source: \t\t{\n\t\t\"query\": {\n\t\t\t\"bool\": {\n\t\t\t\t\"must\": {\n\t\t\t\t\"query_string\": {\n\t\t\t\t\t\"query\": \"title:(*)\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"filter\": {\n\t\t\t\t\"bool\":{\n\t\t\t\t\t\"must\":[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"match_all\": {}\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"should\":[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"range\": {\n\t\t\t\t\t\t\t\t\t\"@timestamp\": {\n\t\t\t\t\t\t\t\t\t\t\"from\": \"2018-06-01\"\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"range\": {\n\t\t\t\t\t\t\t\t\t\"@timestamp\": {\n\t\t\t\t\t\t\t\t\t\t\"from\": \"2018-06-08\"\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t}; line: 25, column: 9]"
      }
    ],
    "type": "json_parse_exception",
    "reason": "Unexpected character ('{' (code 123)): was expecting comma to separate Array entries\n at [Source: \t\t{\n\t\t\"query\": {\n\t\t\t\"bool\": {\n\t\t\t\t\"must\": {\n\t\t\t\t\"query_string\": {\n\t\t\t\t\t\"query\": \"title:(*)\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"filter\": {\n\t\t\t\t\"bool\":{\n\t\t\t\t\t\"must\":[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"match_all\": {}\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"should\":[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"range\": {\n\t\t\t\t\t\t\t\t\t\"@timestamp\": {\n\t\t\t\t\t\t\t\t\t\t\"from\": \"2018-06-01\"\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"range\": {\n\t\t\t\t\t\t\t\t\t\"@timestamp\": {\n\t\t\t\t\t\t\t\t\t\t\"from\": \"2018-06-08\"\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t}; line: 25, column: 9]"
  },
  "status": 500
}

如果在must子句中添加它,则相同,它在“ AND”条件下可以完美工作。您能否以“ AND”和“ OR”条件帮助构架模板?


问题答案:

您快到了,只需要在到达数组的最后一个元素时让小胡子知道即可。因此,您的模板应如下所示(即,我们在每个元素之后添加逗号(最后一个元素除外)):

  ...
                "should":[
                    {{#since}}
                        {
                            "range": {
                                "{{since}}": {
                                    {{#from}}"from": "{{from}}"{{#to}},{{/to}}{{/from}}
                                    {{#to}}"to":"{{to}}"{{/to}}
                                }
                            }
                        }{{^last}},{{/last}}                <-- modify this line
                    {{/since}}
                ]
  ...

然后只需修改您的调用以将last标志包含到since数组的最后一个元素即可:

POST _search/template
{
  "id": "dateTemplate",
  "params": {
    "searchkeyword": "*",
    "since":[ {
      "since":"@timestamp",
      "from": "2018-06-01"
    },
     {
      "since":"@timestamp",
      "from": "2018-06-08",
      "last": true                                         <-- add this line
    }
    ]
  }
}


 类似资料:
  • 问题内容: 嗨,我有供cpu使用的文档,其中包含date_time字段。现在,我想查找日期范围内的avg cpu用法。我想出了以下解决方案。如果我是Elastic Search的新手,请告诉我是否有任何先进或更好的方法。 现在,上面的查询返回我期望的文档,该文档在/日期范围内。现在,我要做的是,使用这些文档找到所有唯一的日期,并将这些唯一的日期组合存储在中,然后针对其中的所有项目执行以下查询 现在

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

  • 问题内容: 我有这样的文件: 是否可以按日期查询最近10天发布的文档数量?例如: 问题答案: 是的,您可以使用聚合轻松实现这一点,如下所示:

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

  • 问题内容: 以下range_query返回预期结果: 但是,与多个范围查询一起,则不会返回任何内容: 在多个字段上使用多个range_queries的正确方法是什么? 编辑: 啊,好的,所以这是我使用range_filter而不是range_query的地方?这听起来很有希望,所以我仅使用一个范围过滤器重新编写了查询。如果我在其他地方弄乱了查询,请在此处发布所有内容。我正在执行GET,并且源密钥中

  • 问题内容: 我在elasticsearch中存储以下信息: 假设我还有另一个日期范围(例如,从用户输入中得出),我想搜索一个相交的时间范围。与此类似:确定两个日期范围是否重叠这概述了以下逻辑: 但是我不确定如何将其放入elasticsearch查询中,我会使用范围过滤器并且仅将“ to”值设置为,而将from留为空白吗?还是有一种更有效的方法? 问题答案: 更新:现在可以使用在elasticsea