使用只有一个单词的字符串字段在 Elasticsearch 中进行通配符搜索
Wildcard search in Elasticsearch with a string field having only one word
我有一个用例,我的索引中有一个字符串类型的字段,它的值是单个单词(车号),需要按以下方式搜索它:*abc*
实现它的最佳方法是什么?同样的方法会对性能产生什么影响?
目前我正在使用以下查询:_search?q=vehicleNumber:*119*
在我看来,它还没有经过优化。
使用前导通配符可能会变得非常昂贵...如果您主要使用该通配符搜索数字 "substrings" 并且其格式是标准化的(想想 XX-12345-AB
形式的车牌号),您可以只将这些数字提取到一个附加字段中,然后对其进行范围查询。这肯定比在字符串上使用通配符要快。
另一种选择是使用 regex queries which would be helpful if you for instance know the position of where you wanna search. It turns out IMEIs do have a certain structure -- AA-BBBBBB-CCCCCC-EE
-- from wiki
因此,如果您要查找序列号匹配项,请跳至索引 8:
GET /_search
{
"query": {
"regexp": {
"vehicleNumber": {
"value": ".{8,}119.*"
}
}
}
}
总结一下,regexp
和 wildcard
使用 same automaton in the background,因此在执行 leading *
查询时,在两者之间进行选择不会提高速度性能。但是当你知道这个位置时,我怀疑 regexp
可能会对此进行更优化。
我有一个用例,我的索引中有一个字符串类型的字段,它的值是单个单词(车号),需要按以下方式搜索它:*abc*
实现它的最佳方法是什么?同样的方法会对性能产生什么影响?
目前我正在使用以下查询:_search?q=vehicleNumber:*119*
在我看来,它还没有经过优化。
使用前导通配符可能会变得非常昂贵...如果您主要使用该通配符搜索数字 "substrings" 并且其格式是标准化的(想想 XX-12345-AB
形式的车牌号),您可以只将这些数字提取到一个附加字段中,然后对其进行范围查询。这肯定比在字符串上使用通配符要快。
另一种选择是使用 regex queries which would be helpful if you for instance know the position of where you wanna search. It turns out IMEIs do have a certain structure -- AA-BBBBBB-CCCCCC-EE
-- from wiki
因此,如果您要查找序列号匹配项,请跳至索引 8:
GET /_search
{
"query": {
"regexp": {
"vehicleNumber": {
"value": ".{8,}119.*"
}
}
}
}
总结一下,regexp
和 wildcard
使用 same automaton in the background,因此在执行 leading *
查询时,在两者之间进行选择不会提高速度性能。但是当你知道这个位置时,我怀疑 regexp
可能会对此进行更优化。