elasticsearch 如何对长类型运行通配符查询?

wz3gfoph  于 2022-12-03  发布在  ElasticSearch
关注(0)|答案(1)|浏览(334)

我只是在我的elasticsearch服务器上运行一个简单的通配符查询。
我的疑问是:

GET calls-*/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "should": [
              {
                "query_string": {
                  "default_field": "foo.number",
                  "query": "*16922*"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

错误响应如下所示;

Can only use wildcard queries on keyword, text, and wildcard fields - not on [foo.number] which is of type [long]

当我检查索引信息时,我看到number类型是long。如果我从long切换到text,一切都按预期运行。这个answer表示完全相同的事情。

"number": {
  "type": "long",
  "ignore_malformed": false,
  "coerce": true
},

但是我不能改变数字类型,因为代码将发送到prod服务器,我不能修改任何prod弹性索引。
那么我如何运行我的通配符查询而不出现任何错误呢?如果唯一的方法是修改索引(从long切换到text),我可以用另一种方法代替通配符查询吗?

ygya80vv

ygya80vv1#

不能直接在数字数据类型字段上执行通配符搜索

如果要对长类型字段执行通配符搜索,则有一种方法是更新索引Map,重新索引数据,然后使用通配符搜索。
在更新索引Map时,您可以保留foo.number字段的类型为long,并使用Update Mapping API向其添加一个text类型的子字段,如下所示:

步骤1:更新Map

PUT /_mapping
{
    "properties": {
        "foo": {
            "properties": {
                "number": {
                    "type": "long",
                    "fields": {
                        "key": {
                            "type": "text"
                        }
                    }
                }
            }
        }
    }
}

步骤2:重新索引数据
步骤3:搜索查询

{
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "should": [
              {
                "query_string": {
                  "default_field": "foo.number.key",
                  "query": "*123*"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

点击上述搜索并执行步骤1和步骤2后,您将获得所需的结果。

相关问题