访问个人博客html
自从使用 ElasticSearch 重构了主站的搜索项目以后,以后又陆续接入了其余两个项目,目前使用 SpringBoot 方式跑了一个伪集群,主站使用的时候,比较稳定,没有人反馈说有问题。java
但新接入的一个站点商务反馈说,搜索不够准确,彻底匹配的关键词不是排在搜索结果列表首位,跑到搜索上去看了一眼,确实彻底匹配的结果分数不是最高的,致使没有排在结果首位,今天就来解决这个问题。git
<!--more-->github
默认匹配查询
先看看我以前写的查询代码片断,elasticsearch
MultiMatchQueryBuilder matchQuery = QueryBuilders.multiMatchQuery(query.getQueryString(), "name", "author"); boolQuery.must(matchQuery);
这种写法,彻底没有对搜索结果的平分进行干扰,只是按照 ES 的默认分词计算匹配度的结果。ide
权重查询
我尝试了使用权重查询,即提高某些字段的权重,可是设置以后,结果反而更加不尽如人意。ui
boolQuery.should(QueryBuilders.matchQuery("name", queryString).boost(3.0f)); boolQuery.should(QueryBuilders.matchQuery("author", queryString).boost(1.f));
这样进行查询以后,若是想要查询做者,可是做品名称的权重更高些,因此彻底匹配的做者也被排在了后面。spa
最佳字段查询
看了官方博客和一篇博客文章,发现 multi-match-query
的高级查询方式。code
multi_match
多匹配查询的类型有多种,其中的三种恰巧与 了解咱们的数据 中介绍的三个场景对应,即:best_fields
、most_fields
和cross_fields
(最佳字段、多数字段、跨字段)。htm
这里咱们想要搜索时,彻底匹配的关键字排名更靠前,因此这里使用最佳字段 best_fields 进行查询
MultiMatchQueryBuilder multiMatchQuery = QueryBuilders .multiMatchQuery(queryString, "name", "author") .type(MultiMatchQueryBuilder.Type.BEST_FIELDS) .tieBreaker(0.1f); boolQuery.must(multiMatchQuery);
首先设置 type 为 BEST_FIELDS,其次,咱们想要彻底匹配的分数高点,那么就让没有彻底匹配的分文档评分低便可,我这里乘以了 0.1 的系数,系数的范围是 0-1 之间。
加上了系数以后,不彻底匹配的文档评分就被拉开了,就达到了个人最终目的。