我是 flex 搜索的新手,我正努力处理日期范围查询。我必须查询介于某些特定日期之间的记录。推送到 flex 搜索数据库中的JSON记录如下:

                "messageid": "Some message id",
                "subject": "subject",
                "emaildate": "2020-01-01 21:09:24",
                "starttime": "2020-01-02 12:30:00",
                "endtime": "2020-01-02 13:00:00",
                "meetinglocation": "some location",
                "duration": "00:30:00",
                "employeename": "Name",
                "emailid": "abc@xyz.com",
                "employeecode": "141479",
                "username": "username",
                "organizer": "Some name",
                "organizer_email": "cde@xyz.com",

我必须查询开始时间在“2020-01-02 12:30:00”到“2020-01-10 12:30:00”之间的记录。我写了这样的查询:
{
   "query":
      {
        "bool":
           {

              "filter": [
                {
                    "range" : {
                        "starttime": {
                             "gte": "2020-01-02 12:30:00",
                             "lte": "2020-01-10 12:30:00"
                         }
                    }
                }
              ]
           }
      }
}

该查询没有给出预期的结果。我假设将数据推送到我办公室的 flex 搜索数据库中的人员尚未设置映射,并且 flex 搜索正在动态地将“开始时间”的数据类型确定为“文本”。因此,我得到的结果不一致。
我可以这样设置映射:
PUT /meetings
{
  "mappings": {
    "dynamic": false,
    "properties": {
        .
        .
        .
        .
      "starttime": {
        "type": "date",
        "format":"yyyy-MM-dd HH:mm:ss"
      }
        .
        .
        .
    }
  }
}

该查询将起作用,但不允许这样做(办公政策)。我有什么选择可以完成任务。

更新:

我假设数据类型为“文本”,但是默认情况下,Elastic Search会同时应用“文本”和“关键字”,这样我们就可以实现基于全文和关键字的搜索。如果还设置为“关键字”。无论如何,这对我有好处吗?我无法在办公室中访问很多东西,这就是为什么我无法调试查询的原因。我只有用于构建查询的搜索API。

GET / meetings / _mapping输出:
  '
  '
  '
 "starttime" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
  }

    '
    '
    '

最佳答案

正如@jzzfs所建议的那样,该想法是在date字段中添加starttime子字段。您首先需要修改映射,如下所示:

PUT meetings/_mapping
{
  "properties": {
     "starttime" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          },
          "date": {
            "type" : "date",
            "format" : "yyyy-MM-dd HH:mm:ss",
          }
        }
     }
  }
}

完成后,您需要使用update by query API重新索引数据,以便填充starttime.date字段并建立索引:
POST meetings/_update_by_query

更新完成后,您将可以利用查询中的starttime.date子字段:
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "starttime.date": {
              "gte": "2020-01-02 12:30:00",
              "lte": "2020-01-10 12:30:00"
            }
          }
        }
      ]
    }
  }
}

关于elasticsearch - Elasticsearch 日期范围查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60261527/

10-13 07:48
查看更多