Lucene/Solr/ElasticSearch搜索问题案例分析

2024-05-15 03:32

本文主要是介绍Lucene/Solr/ElasticSearch搜索问题案例分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 


最近收集的两个搜索的case,如下: 

案例一: 

使用 A关键词:“中国诚通控股公司”搜索,不能搜到 B结果“中国诚通控股集团有限公司” 

从关键词字面上看,确实不应该出现这种问题,因为A的关键词完全被B包含,如果说搜索B,搜不到A到还可以接受,因为 
在关键词越长的情况下,term之间是AND的关系,这样返回结果集就越少,这一点从Google或者其他电商的搜索都可以得到测试确认, 

看到这种问题,一般情况下,都跟分词有关系,然后拿到Solr中, 

先使用IK最细粒度分词测试两个关键词的分词结果如下:
 




再使用Ansj索引分词测试两个关键词的分词结果如下:
 






从上面可以看出差异,A里面有个完整的term:控股公司,B里面没有, 
如果按照AND关系的匹配,意思是:A里面出现的每一个term,在B里面都必须能找到   这样的逻辑走下去 
A搜不到B是正常的。 


中文分词的问题,一般是由词库引起的,那么如何解决上面的问题呢? 

(1)改词库: 
去掉控股公司这个关键词,这样A的分词结果里面不会出现控股公司这个关键词,而只有控股+公司 
这样以来A完全被B包含,可以正常搜索,但是这样做的话,就意味着,所有这样非最小属性的关键词都要被去掉,才能 
保证最大限度不会这种类似的问题,改词库后还需要重建索引,变动比较大,而且比较不灵活。 

(2)改匹配方式: 
有人说AND关系不行,那就OR呗,没错,用OR确实可以搜索出来,但是,这样以来无论搜什么, 
搜索结果命中数量就会变的异常巨大,尤其是在关键词越长,总数据量大的情况下,对用户体验和搜索性能都不是 
最好的选择。这时才会发现无论你怎么改,都有引发一些新的问题,所以搜索引擎对中文检索来说,如果能保证90%的搜索效果是最优的, 
就已经是非常不错的结果了,下面接着谈:  

既然AND+OR+修改词库的方式,都不太理想,那么我们采取一种折中的方式,来优化查询结果呢? 答案是肯定的,Lucene/Solr/ElasticSearch有一种 
按照term匹配个数,来优化查询结果的方式,并且可以限制不同个数的采取不同的匹配方式,散仙在前面的文章,也分析过,这里不在详细展开, 
有兴趣可以访问  http://qindongliang.iteye.com/blog/2302483 地址,查看此文章。这里大概描述下处理思路: 

对于短文本关键词分词后term个数小于3的,我们采用精确匹配 
对于中文本关键词分词后term个数大于3小于9的,我们乐观模式的缺减匹配,至多允许一个词不一致 
对于长文本关键词分词后term个数大于10的,我们悲观模式的缺减匹配,至少允许一个词不一致 

尽量保证在查准和召全之间的得到一个平衡,当然这需要不断调试,探索,改进才能得出来,并非泛泛而谈。 


案例二: 

业务定义,有限公司和有限责任公司应该是相同的意思,搜索的时候,可互相搜索出来,比如 

搜A:小米科技有限公司  要求能搜到  小米科技有限责任公司 
搜B:小米科技有限责任公司  要求能搜到  小米科技有限公司 

有人说这很简单,直接把有限公司和有限责任公司作为同义词映射不就行了,这是一种办法,然而依旧解决不了这种问题。 

why? 同义词映射应用在精确查询的字段上,没有啥问题,但现在要求映射在分词字段上,而且,有限公司和有限责任公司并不是不可再分的 
属性了,他们还可以切分更细粒度的关键词,我们在solr中,看下他们的分词效果: 


 


 




从上面的截图中,可以看出,在匹配方式,设置为AND的时候,从A可以搜到B,但反过来就不行了,B是搜不到A的, 
因为他们还可以再切分,如何解决? 

这种情况下改词库也解决不了,你不可能将有限公司和有限责任公司保留,而细粒度的关键词去掉,这样的话,召全率就会出现问题 

比较好的解决办法是: 
(1) 匹配方式更改,正如案例一种的场景,我们可以允许term中,有1到2个term词不匹配,这样的话,就可以互相搜到,但是可能 
在召全率上提升,查准率上有所下降,因为他们本来就是相生相克的关系,一个率升高,另一个率必然下降。 

(2)进行数据归一化处理,我们知道在英文搜索中,一个单词可能有单数形式,复数形式,现在时,过去时等等等等,搜索引擎不关注你的七十二变, 
只需要归一化到最原始的状态,然后索引起来,在搜索时候同样归一化,这样以来,无论你有多少种变化方式,在搜索引擎看来,就有只有一种原始 
状态,把复杂的问题简单化,然后操作,是不错的一种处理方式,反映到这个例子中,我们可以使用同样的办法,比如有限责任公司,在索引和搜索的时候 
统一归一化成有限公司检索,这样既能保证查全也保证了查准,当然需要我们额外做的,就是在数据规则上多下点功夫,然后不断完善我们的搜索系统。 



总结: 
文章简单剖析了,上面两种case造成的原因以及和他们的一些解决方法,当然这只是众多的问题中的几个例子,此外,任何一类问题的解决,都会可能引起新的问题,所以我们还是要具体问题,具体分析,能简单解决,就不要使用复杂的策略,更不要南辕北辙,忘了初心。 



有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 
技术债不能欠,健康债更不能欠, 求道之路,与君同行。 

 

这篇关于Lucene/Solr/ElasticSearch搜索问题案例分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑