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