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"