ES模糊查询来对应mysql的like查询

使用ES查询来对应mysql的like查询

建立一个测试索引

PUT /test_like1
{
    "mappings" : {
      "properties" : {
        "num" : {
          "type" : "keyword"
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
         "englishName" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
         "msg" : {
          "type" : "text",
            "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
   	     }
        }
      }
    }
}

插入一条测试数据

PUT  /test_like1/_doc/1
{
  "num": "123456",
  "name": "小明",
  "englishName": "xiaoMing",
  "msg": "我爱学习"
}

1.使用Wildcard Query的通配符进行查询

前提是查询的字段类型是string类型,对应ES中的text,keyword(这种查询方式会慢,查询不进行分词处理)

GET /test_like1/_search
{
  "query": {
    "wildcard": {
      "msg.keyword": "*爱学*"
    }
  }
}

2.使用match_phrase进行查询

GET /test_like1/_search
{
  "query": {
    "match_phrase": {
      "msg": "爱学"
    }
  }
}

GET /test_like1/_search
{
  "query": {
    "match_phrase": {
      "num": "23"
    }
  }
}

查询name和msg字段发现可以查询出来,但是查询num和englishName会发现查询不出来数据。

这是因为ES默认会把中文进行单个字的分词拆分,而对于英文和数字是基于空格进行拆分的,这显然不符合我们对于mysql的like查询,对此我们可以建立一个分词器来解决。

建立一个带分词的索引

ES中的字段必须是text类型,因为要进行分词处理

PUT /test_like2
{
    "mappings" : {
      "properties" : {
        "num" : {
          "type" : "text",
          "analyzer": "my_analyzer"
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          },
          "analyzer": "my_analyzer"
        },
         "englishName" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          },
          "analyzer": "my_analyzer"
        },
         "msg" : {
          "type" : "text",
            "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          },
          "analyzer": "my_analyzer"
        }
      }
    },
    "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "my_analyzer": {
            "type": "custom",
            "tokenizer": "my_tokenizer"
          }
        },
        "tokenizer": {
          "my_tokenizer": {
            "type": "ngram",
            "min_gram": "1",
            "max_gram": "2"
          }
        }
      }
    }
  }
}

插入一条测试数据

PUT  /test_like2/_doc/1
{
  "num": "123456",
  "name": "小明",
  "englishName": "xiaoMing",
  "msg": "我爱学习"
}

在进行测试查询,发现可以查询了

GET /test_like2/_search
{
  "query": {
    "match_phrase": {
      "englishName": "in"
    }
  }
}
posted on 2020-07-21 10:06  有梦可有为  阅读(10641)  评论(0编辑  收藏  举报