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"
    }
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM