我只是在我的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
),我可以用另一种方法代替通配符查询吗?
1条答案
按热度按时间ygya80vv1#
不能直接在数字数据类型字段上执行通配符搜索
如果要对长类型字段执行通配符搜索,则有一种方法是更新索引Map,重新索引数据,然后使用通配符搜索。
在更新索引Map时,您可以保留
foo.number
字段的类型为long
,并使用Update Mapping API向其添加一个text
类型的子字段,如下所示:步骤1:更新Map
步骤2:重新索引数据
步骤3:搜索查询
点击上述搜索并执行步骤1和步骤2后,您将获得所需的结果。