使用只有一个单词的字符串字段在 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.*"
      }
    }
  }
}

总结一下,regexpwildcard 使用 same automaton in the background,因此在执行 leading * 查询时,在两者之间进行选择不会提高速度性能。但是当你知道这个位置时,我怀疑 regexp 可能会对此进行更优化。