[ElasticSearch从入门到场景实战]深入搜索之多字段搜索

1,722 阅读3分钟

人生起起伏伏,有风光无限日,也有落魄失魂时,人在低谷时,唯有“熬过去,才会赢”

前言

大家好,我又来了,这一期要将多字段匹配了,进度还是有点慢的,哈哈哈哈,没关系没关系,我们慢慢学习啦。

多字符串查询

简单说,多字符川查询就是多条件查询,多条件查询,我们第一选择就是bool查询,bool查询本身采取的策略就是条件越多越好,当子查询是match语句时,bool查询语句的评分,是每条match语句评分加起来的总和。 具体的查询方式这里就不写了,之前的文章都有写过,这边只是顺带提到一下这个概念。

multi_match查询

multi_match查询是在多个字段上对一个条件进行反复查询,缩短我们的代码量,比如我现在要在titlecontent两个字段,查询带有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的地址,有兴趣的朋友可以下载看看,里面都有系列文章的所有操作。

github:https://github.com/gshjd/elasticsearch-demo

1d539c0bf7d7bb104a29bf93ff2db6ed.png