ElasticSearch wildcard通配符查询(模糊查询)

说明

相当于 sql 中的 like 模糊查询

通配符

  • ?代表任意一个字符,相当于 SQL 中的 _
  • * 代表任意多个字符,包括一个空字符,相当于 SQL 中的 %

注意

  • 适用 keyword 类型的字段,区分大小写

  • 也可以用于 text 类型,但模糊查询中文 会有问题

  • 为了防止极慢的通配符查询,不应以通配符 * 或 ? 开头

例子

比如在搜索 店名、人名,一般这类名字都不是 日常的 词,如:史珍香同学

GET /toutiao_v1/_search
{
  "query":{
    "wildcard":{
      "author":"李*"
    }
  }
}
GET /meituan_v1/_search
{
  "query": {
     "wildcard": {
      "name": {
        "value": "*拉面*"
      }
    }
  }
}

text类型有多个单词的问题

wildcard模糊查询 text 类型的字段,查询条件有 多个单词,会查询不到

GET /toutiao_v1/_search
{
    "query":{
        "wildcard":{
            "title":"JAVA mysql*"
        }
    }
}

当有2个单词时,查询不到

可以通过 keyword子类型 模糊查询

GET /toutiao_v1/_search
{
    "query":{
        "wildcard":{
            "title.keyword":"JAVA mysql*"
        }
    }
}

可以查询到

text类型有多个汉字的问题

wildcard模糊查询 text 类型的字段,查询条件有 多个汉字,会查询不到

get /toutiao_v1/_search
{
  "query":{
    "wildcard":{
      "title":"*技巧*"
    }
  }
}

当有2个以上汉字时,查询不到

查询条件有1个汉字可以查询

get /toutiao_v1/_search
{
  "query":{
    "wildcard":{
      "title":"*技*"
    }
  }
}

可以查询到结果

可以通过 keyword子类型 模糊查询

GET /toutiao_v1/_search
{
  "query": {
     "wildcard": {
      "title.keyword": "*技巧*"
    }
  }
}

原文出处:/show_1IX1qPCpOZVz.html