Elasticsearch 索引中有一个“备注”字段,其中包含各种备注以及给出该备注的日期。
例如:
remark
------
14/02/2023 To be updated ; 15/02/2023 Further action is needed ; 16/02/2023 Looks good
由于某些实现特定的原因,我无法将日期拆分为单独的字段。 我需要查询与“备注”字段中给定日期范围匹配的所有记录。 例如:检索日期范围 15/02/2023 和 16/02/2023 内的所有记录。
我在 Elasticsearch 中编写了以下查询:
GET myindex/_search
{
"query"
: {
"bool"
: {
"must"
: [
{
"range"
: {
"remark"
: {
"gte" : "2023-02-15",
"lte" : "2023-02-16"
}
}
}
]
}
},
"highlight"
: {
"fields"
: {
"content"
: {
"type" : "unified",
"fragment_size" : 150,
"number_of_fragments" : 3,
"pre_tags" : [""],
"post_tags" : [""]
}
}
},
"size"
: 1000
}
上面的查询不起作用,因为字段“remark”不是日期时间类型。
这个问题有解决办法吗?
是的,可以将 text 或 keyword 字段类型与
range
查询一起使用,但这是一个昂贵的查询,因此默认情况下禁用。
使用文本和关键字字段的范围查询
在以下情况下,将不会执行文本或关键字字段的范围查询: search.allow_expense_queries 设置为 false。
我不会建议您启用它,但如果您愿意,可以使用:
PUT _cluster/settings
{
"transient": {
"search.allow_expensive_queries": "true"
}
}
更新集群设置后,您的查询将起作用。
推荐: 添加新字段:
PUT index_name/_mapping
{
"properties": {
"remark_date": {
"type": "date"
}
}
}
并更新数据,通过查询更新将为每个文档添加新的字段和值。
POST index_name/_update_by_query?wait_for_completion=false