我们都知道在ES中如果我们想要实现MySQL中的like查询的时候可以使用wildcard 通配符来进行操作。其中?代表任意一个字符*代表任意的一个或多个字符

GET booke/member/_search
{"query": {
    "wildcard":{
      "senderName": "李*"
    }
   
}
  
}
 
 
#模糊查询,比如查询李政,PS:查不出李世民
GET booke/member/_search
{"query": {
    "wildcard":{
      "senderName": "李?"
    }
   
}
  
}

java操作如下:

boolQueryBuilder.should(QueryBuilders.wildcardQuery("word", "*" + obj + "*"));

但是这样会对你查询的内容进行分词,查询的结果不一定准确,比如你只想查出:word="你好呀"

的数据,但是分词后就会查出 word="你"或者 word="好"等其他数据。可以使用keyword标识就不会进行分词了。如下:

    #模糊查询,比如查询李世民
    GET booke/member/_search
    {"query": {
        "wildcard":{
          "senderName.keyword": "李*"
        }
       
    }
      
    }

java代码如下:

boolQueryBuilder.should(QueryBuilders.wildcardQuery("word.keyword", "*" + obj + "*"));

 

实际使用模糊查询的案例:

BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
queryBuilder.must(QueryBuilders.matchQuery("status", v));


// tag字段 tag= "精神|你好|多谢"
BoolQueryBuilder keywordQuery = QueryBuilders.boolQuery();
keywordQuery.should(QueryBuilders.wildcardQuery("tag.keyword", v + "|*"));
keywordQuery.should(QueryBuilders.wildcardQuery("tag.keyword", "*|" + v + "|*"));
keywordQuery.should(QueryBuilders.wildcardQuery("tag.keyword", "*|" + v));

// 多条should必须最少满足一个才能返回
keywordQuery.minimumShouldMatch(1);
queryBuilder.must(keywordQuery);

es.search(queryBuilder);

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐