Lucene+Solr+ElasticSearch查询匹配优化

2024-05-15 03:32

本文主要是介绍Lucene+Solr+ElasticSearch查询匹配优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当我们在处理搜索业务时候,需求往往是灵活多变的,有时候我们需要精确匹配,有时候我们又需要全文检索,而有时候,我们又想匹配度高而且还能全文检索,这似乎是精确匹配和模糊匹配一个妥协的策略,没错这就是搜索引擎出现的目的,以往的数据库是没法解决这种问题的,数据库只能回答有,没有,存在,不存在,并不能在有和没有之间做一个完美的妥协,比如说能把最匹配最相关的结果放在topN,仅靠like模糊查询是解决不了这种问题的。 


Apache Lucene这个强大的全文检索核心包,提供了搜索引擎的核心组件,通过相关性评分算法(VSM/BM25),出色的了解决了相关性匹配问题,当然Solr和ElasticSearch构建在Lucene之上,自然也继承了这种优秀的能力。 

默认情况下,Lucene/Solr/ES的Boolean查询有三种查询策略: 
(1)必须匹配 -> must 
(2)必须不匹配 -> mustn't 
(3)至少匹配一个 ->should 

除此之外,对于分词字段,我们还可以通过 最小匹配查询(Minimum Should Match)来灵活控制查询策略 

举个例子: 北京奇虎科技有限公司 

使用IK最细粒度分词后内容:北京/奇虎/科技/有限公司/有限/有/限/公司 


我们可以通过defType=edismax&mm=100%25来控制term最小命中的个数,下面来看下mm参数的详细解释: 

语法一:mm=3  代表至少匹配3个term,不管总term有多少个,如果查询词分词后的term个数小于3,那么就以最小的这个term数为基准进行查询 
语法二:-2    允许返回的结果里面,最多有2个不匹配term,其他的必须都匹配,这是一种反向用法 
语法三:mm=75% 允许返回的结果里面,至少有75%匹配度,如果不能整除,则采取进一法来得到最小匹配个数,比如计算值=3.75,那么这个mm就等于3,如果等于0.6这个等于0 
语法四:mm=-25% 反向设置,返回的结果里面最多有25%的不匹配 
语法五:3<90%  如果一个字段分词后的term数,小于等于3,则要求全部匹配,如果大于3,则要求90%的匹配度 
语法六:2<-25% 9<-3  小于2个term,要求全部匹配,如果是3-9个要求100%-25%=75%匹配,如果大于9个,则最多允许有3个不匹配term出现 


情景1:查询北京奇虎+mm=3 能查询到北京奇虎科技有限公司 
情景2:查询北京奇虎360+mm=3 不能查询到北京奇虎科技有限公司 
情景3:查询北京奇虎360+mm=2 能查询到北京奇虎科技有限公司 
情景4:查询北京奇虎360+mm=80%(3*80%=2.4=2) 能查询到北京奇虎科技有限公司 
情景5:查询北京奇虎360+mm=-10%((3-3*0.1(减一法等0))=3)不能查询到北京奇虎科技有限公司 


总结: 

对于分词后term数少的,适合采用固定数进行查询限制优化查询 
对于分词后term数多的,适合采用百分比进行查询限制优化 
mm=0% 代表最少匹配查询词里面出现的任意一个term 
mm=100% 代表必须匹配查询词里面所有出现的term 

大家可在自己的场景中,不断反复测试,以找到合适的阈值,从而避免查询结果集过大,有太多不相关的数据或者查询结果集偏小漏掉一些相关的数据。 


参考资料: 
https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Themm(MinimumShouldMatch)Parameter  
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-minimum-should-match.html  

这篇关于Lucene+Solr+ElasticSearch查询匹配优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/990683

相关文章

房产证 不动产查询

陕西政务服务网(便民服务)陕西政务服务网(手机版?更直观)不动产权证书|不动产登记证明(电子证照)商品房合同备案查询权利人查询

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

服务器雪崩的应对策略之----SQL优化

SQL语句的优化是数据库性能优化的重要方面,特别是在处理大规模数据或高频访问时。作为一个C++程序员,理解SQL优化不仅有助于编写高效的数据库操作代码,还能增强对系统性能瓶颈的整体把握。以下是详细的SQL语句优化技巧和策略: SQL优化 1. 选择合适的数据类型2. 使用索引3. 优化查询4. 范式化和反范式化5. 查询重写6. 使用缓存7. 优化数据库设计8. 分析和监控9. 调整配置1、

Java中如何优化数据库查询性能?

Java中如何优化数据库查询性能? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Java中如何优化数据库查询性能,这是提升应用程序响应速度和用户体验的关键技术。 优化数据库查询性能的重要性 在现代应用开发中,数据库查询是最常见的操作之一。随着数据量的增加和业务复杂度的提升,数据库查询的性能优化显得尤为重

BD错误集锦9——查询hive表格时出错:Wrong FS: hdfs://s233/user/../warehouse expected: hdfs://mycluster

集群环境描述:HDFS集群处于HA模式下,同时启动了YARN\JN\KAFKA\ZK。 现象: FAILED: SemanticException Unable to determine if hdfs://s233/user/hive/warehouse/mydb.db/ext_calllogs_in_hbase is encrypted: java.lang.IllegalArgument

MybatisPlus指定字段查询

一,上代码 QueryWrapper<Device> queryWrapper = Wrappers.query();queryWrapper.select("project_id as projectId,count(device_id) as total").in("project_id",projectIds).isNotNull("project_id").eq("del_flag",B

打包体积分析和优化

webpack分析工具:webpack-bundle-analyzer 1. 通过<script src="./vue.js"></script>方式引入vue、vuex、vue-router等包(CDN) // webpack.config.jsif(process.env.NODE_ENV==='production') {module.exports = {devtool: 'none

ORACLE 、达梦 数据库查询指定库指定表的索引信息

在Oracle数据库中,索引是一种关键的性能优化工具,通过它可以加快数据检索速度。在本文中,我们将深入探讨如何详细查询指定表的索引信息,以及如何利用系统视图和SQL查询来获取这些信息。 索引在数据库中的重要性 索引是一种数据结构,用于加快数据库表中数据的检索速度。它类似于书籍的目录,可以帮助数据库引擎快速定位数据行,特别是在大型数据集合下,其作用尤为显著。 查询指定表的索引信息 在Orac