[英]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.