Elasticsearch中的通配符搜索

时间:2018-06-27 09:47:01

标签: java elasticsearch lucene

当前,我在通配符搜索下方使用我的服务,

{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "PRODUCT_DESCRIPTION": "\*collaboration\*services\*shiriyara\*"
          }
        }
      ]
    }
  }
}

这将返回我预期的结果。但是我正在寻找不使用通配符查询来实现此目的的替代方法,因为通配符需要更多时间。

我在“标准”分析字段上尝试了“ query_string”。但是,如果整个单词都匹配,则返回结果。

          "query_string": {
            "default_field": "PRODUCT_DESCRIPTION",
            "default_operator": "AND",
            "query": "collaboration services shiriyara"
          }

如果字符串是“ collab services shiriyara”,则不会给出任何结果,而通配符会给出结果。

如果有人有想法,请告诉我。索引时间的更改对我来说也很好。

2 个答案:

答案 0 :(得分:1)

您可以按以下方式分解通配符,这将适用于您给出的示例:

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {"wildcard": {"PRODUCT_DESCRIPTION": "collab*"}},
        {"wildcard": {"PRODUCT_DESCRIPTION": "serv*"}},
        {"wildcard": {"PRODUCT_DESCRIPTION": "shiri*"}}
      ]
    }
  }
}

或者,您可以考虑在索引时间使用ngrams,这将允许单词中字符序列的匹配。

答案 1 :(得分:1)

我知道这是一个老问题,但以防万一有人再次遇到它:在 Elasticsearch 7.9 中引入了一个新的 wildcard field type,用于快速查找字符串值中的模式。