簡體   English   中英

彈性搜索日期范圍查詢

[英]Elastic Search Date Range Query

我是彈性搜索的新手,我正在努力處理日期范圍查詢。 我必須查詢落在某些特定日期之間的記錄。推入彈性搜索數據庫的 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" 
                         }
                    }
                }
              ]            
           } 
      }
}

此查詢未按預期提供結果。 我假設將數據推送到我辦公室的彈性搜索數據庫的人沒有設置映射,並且彈性搜索正在動態地將“開始時間”的數據類型決定為“文本”。 因此,我得到了不一致的結果。 我可以這樣設置映射:

PUT /meetings
{
  "mappings": {
    "dynamic": false,
    "properties": {
        .
        .
        .
        .
      "starttime": {
        "type": "date",
        "format":"yyyy-MM-dd HH:mm:ss"
      }
        .
        .
        .
    }
  }
}

查詢將起作用,但我不允許這樣做(辦公室政策)。 我有什么選擇可以完成我的任務。

更新 :

我假設數據類型為“文本”,但默認情況下,彈性搜索同時應用“文本”和“關鍵字”,以便我們可以實現全文和基於關鍵字的搜索。 如果它也設置為“關鍵字”。 無論如何,這對我有好處嗎。 我無法訪問辦公室中的很多東西,這就是我無法調試查詢的原因。我只有搜索 API,我必須為其構建查詢。

獲取 /meetings/_mapping 輸出:

  '
  '
  '
 "starttime" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
  }

    '
    '
    ' 

日期范圍查詢不適用於文本字段,為此,您必須使用日期字段

由於您正在處理日期字段,因此最佳做法是使用日期字段。

我建議您將索引重新索引到另一個索引,以便您可以將文本字段的類型更改為日期字段

步驟 1-:使用 index1 映射創建 index2 並確保將日期字段的類型更改為文本到日期類型

步驟 2-:運行 elasticsearch reindex 並將所有數據從 index1 重新索引到 index2。 由於您已將字段類型更改為日期字段類型。 Elasticsearch 現在會將此字段識別為日期

POST _reindex
 { 
"source":{ "index": "index1" },
 "dest": { "index": "index2" }
 }

現在您可以在 index2 上運行正常日期查詢

有在搜索時分析文本字段日期的方式,但開銷是不切實際的......你可以,但是,保持starttime為文本默認,但使之成為多領域和查詢使用它starttime.as_date ,例如。

作為@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",
          }
        }
     }
  }
}

完成后,您需要使用按查詢更新 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"
            }
          }
        }
      ]
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM