我们都知道在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);