在Elasticsearch中,如何在文本字段上使用范围查询?

问题描述 投票:0回答:1

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”不是日期时间类型。

这个问题有解决办法吗?

elasticsearch elasticsearch-query
1个回答
1
投票

是的,可以将 textkeyword 字段类型与

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

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html#ranges-on-text-and-keyword

© www.soinside.com 2019 - 2024. All rights reserved.