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"