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

de90aj5v  于 2023-02-21  发布在  ElasticSearch
关注(0)|答案(1)|浏览(340)

Elasticsearch索引中有一个“remark”字段,其中包含各种备注沿着给出备注的日期。例如:

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”不是datetime类型,因此上述查询不起作用。是否有解决此问题的方法?

ddarikpa

ddarikpa1#

是的,可以在range查询中使用textkeyword字段类型,但这是一个开销很大的查询,因此默认情况下禁用。

对文本和关键字字段使用范围查询

如果search.allow_expensive_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

相关问题