访问我的博客

自从使用 ElasticSearch 重构了主站的搜索项目之后,之后又陆续接入了其他两个项目,目前使用 SpringBoot 方式跑了一个伪集群,主站使用的时候,比较稳定,没有人反馈说有问题。

但新接入的一个站点商务反馈说,搜索不够准确,完全匹配的关键词不是排在搜索结果列表首位,跑到搜索上去看了一眼,确实完全匹配的结果分数不是最高的,导致没有排在结果首位,今天就来解决这个问题。

默认匹配查询

先看看我之前写的查询代码片段,

MultiMatchQueryBuilder matchQuery = QueryBuilders.multiMatchQuery(query.getQueryString(), "name", "author");
boolQuery.must(matchQuery);

这种写法,完全没有对搜索结果的平分进行干扰,只是按照 ES 的默认分词计算匹配度的结果。

权重查询

我尝试了使用权重查询,即提升某些字段的权重,但是设置之后,结果反而更加不尽如人意。

boolQuery.should(QueryBuilders.matchQuery("name", queryString).boost(3.0f));
boolQuery.should(QueryBuilders.matchQuery("author", queryString).boost(1.f));

这样进行查询之后,如果想要查询作者,但是作品名称的权重更高些,所以完全匹配的作者也被排在了后面。

最佳字段查询

看了官方博客和一篇博客文章,发现 multi-match-query 的高级查询方式。

multi_match 多匹配查询的类型有多种,其中的三种恰巧与 了解我们的数据 中介绍的三个场景对应,即: best_fieldsmost_fieldscross_fields (最佳字段、多数字段、跨字段)。

这里我们想要搜索时,完全匹配的关键字排名更靠前,所以这里使用最佳字段 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 之间。

加上了系数之后,不完全匹配的文档评分就被拉开了,就达到了我的最终目的。

资源下载

参考

最新文章

  1. .NET 基础一步步一幕幕[out、ref、params]
  2. 初试Nodejs——使用keystonejs创建博客网站1(安装keystonejs)
  3. C++模板&泛型编程
  4. Spring基础知识汇总
  5. C# Like参数化 小记
  6. SUID,SGID,Sticky Bit详解(转)
  7. PSYoungGen /PSOldGen/PSPermGen区别
  8. Mysql - 解决Access denied for user ''@'localhost' to database 'mysql'问题
  9. 李洪强iOS开发之-Swift_00_介绍
  10. python 下的数据结构与算法---1:让一切从无关开始
  11. TOMCAT的域名配置
  12. 普通自适应遗传算法AGA的PC和PM公式解读
  13. js中 && 与 || 的妙用
  14. github 出现 Permission denied (publickey)
  15. OpenCV代码:画出轮廓的外接矩形,和中心点
  16. @pathvariable和@RequestParam的区别
  17. HTML5新特性[ Notifications ] 桌面消息
  18. 查询字段描述sql-postgresql
  19. 转:javascript时间戳和日期字符串相互转换
  20. Mybatis和Mysql的Json类型

热门文章

  1. WPF中的数据绑定
  2. temp--贵州银行
  3. 通过sqoop将hdfs数据导入MySQL
  4. squid 正向代理 简单配置
  5. spring filter lister servlet
  6. 基于IP的docker private registry 私有仓库的搭建
  7. JS 控制输入框输入表情emoji 显示在页面上
  8. Minimum setup for Apache+AD SSO
  9. HDU5816 Hearthstone
  10. Linux下Memcache服务器端的安装