人生起起伏伏,有风光无限日,也有落魄失魂时,人在低谷时,唯有“熬过去,才会赢”
前言
大家好,我又来了,这一期要将多字段匹配了,进度还是有点慢的,哈哈哈哈,没关系没关系,我们慢慢学习啦。
多字符串查询
简单说,多字符川查询就是多条件查询,多条件查询,我们第一选择就是bool查询,bool查询本身采取的策略就是条件越多越好,当子查询是match语句时,bool查询语句的评分,是每条match语句评分加起来的总和。
具体的查询方式这里就不写了,之前的文章都有写过,这边只是顺带提到一下这个概念。
multi_match查询
multi_match查询是在多个字段上对一个条件进行反复查询,缩短我们的代码量,比如我现在要在title和content两个字段,查询带有elasticsearch good这个字符串,我们可以简写成如下:
{
"query": {
"multi_match": {
"query": "elasticsearch good",
"fields": ["name","nickName"]
}
}
}
这样就很简单方便了,这个语句转化成Spring Data的写法就更加方便了:
public void multiMatch() {
QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("39446462-d653-40d4-ab01-acb9f07a3161", "name.keyword", "nickName.keyword");
out(queryBuilder);
}
前缀查询
前缀查询对应的是mysql的like%查询,也就是我们日常说的后模糊查询,后模糊查询性能代码对比如下: DSL:
{
"query": {
"prefix": {
"name.keyword": "elasticsearch"
}
}
}
MySQL:
select * from demo where name like 'elasticsearch%'
Spring Data JPA:
public void prefixQuery() {
QueryBuilder queryBuilder = QueryBuilders.prefixQuery("name.keyword", "elasticsearch");
out(queryBuilder);
}
通配符与正则表达式查询
除了刚才提到的后模糊查询,我们也可以使用通配符查询完全实现和like一样的查询操作。除开通配符查询意外,也是支持正则表达式的,可以自己更换一下查询。 DSL:
{
"query": {
"wildcard": {
"name.keyword": "*小*"
}
}
}
MySQL:
select * from demo where name like '%小%'
Spring Data JPA:
public void wildcardQuery() {
QueryBuilder queryBuilder = QueryBuilders.prefixQuery("name.keyword", "e");
out(queryBuilder);
}
注:通配符用法很多,可以参杂在中间查询,比如我要查询李小熊,我可以查询李*熊
查询时输入即搜索
查询时输入即搜索是match_phrase_prefix,它和prefix都是前缀搜索,prefix不做评分计算,只要匹配的,全都会返回,而且推荐使用prefix过滤器,因为这个是会有缓存的,而prefix是不会的。match_phrase_prefix是取一个字符串的末尾最后一个字符做前缀查询,比如我们查询I like elast这个时候实际上会展示 I like elastisearch 等词,但是查询结果没有prefix那么多,因为有max_expansions控制,他会控制elast匹配的词,再去查询含有I和llike的词。其实使用match_phrase_prefix而不加keyword的时候是等同于match,查询结果是一致的。
注:模糊查询的性能并不好,尽量少使用或者使用match_phrase_prefix代替。
总结
最近elasticsearch和jpa有更新了,这边我也把代码升级了,支持最新版本的elasticsearch,这边我贴上github的地址,有兴趣的朋友可以下载看看,里面都有系列文章的所有操作。