Lucene/Solr/ElasticSearch搜索问题案例分析 野性酷女 2022-04-11 05:45 198阅读 0赞 \[img\]http://dl2.iteye.com/upload/attachment/0118/2222/133a7e24-46e8-3060-9018-bfe45e2381cd.jpg\[/img\] \[size=medium\] 最近收集的两个搜索的case,如下: 案例一: 使用 A关键词:“中国诚通控股公司”搜索,不能搜到 B结果“中国诚通控股集团有限公司” 从关键词字面上看,确实不应该出现这种问题,因为A的关键词完全被B包含,如果说搜索B,搜不到A到还可以接受,因为 在关键词越长的情况下,term之间是AND的关系,这样返回结果集就越少,这一点从Google或者其他电商的搜索都可以得到测试确认, 看到这种问题,一般情况下,都跟分词有关系,然后拿到Solr中, 先使用IK最细粒度分词测试两个关键词的分词结果如下:\[/size\] \[img\]http://dl2.iteye.com/upload/attachment/0118/2214/d62b10c6-9d06-3022-9fab-522011d1a947.png\[/img\] \[size=medium\] 再使用Ansj索引分词测试两个关键词的分词结果如下:\[/size\] \[img\]http://dl2.iteye.com/upload/attachment/0118/2216/6695bf10-1a72-3ec4-8c51-1b1a96e506f1.png\[/img\] \[size=medium\] 从上面可以看出差异,A里面有个完整的term:控股公司,B里面没有, 如果按照AND关系的匹配,意思是:A里面出现的每一个term,在B里面都必须能找到 这样的逻辑走下去 A搜不到B是正常的。 中文分词的问题,一般是由词库引起的,那么如何解决上面的问题呢? (1)改词库: 去掉控股公司这个关键词,这样A的分词结果里面不会出现控股公司这个关键词,而只有控股+公司 这样以来A完全被B包含,可以正常搜索,但是这样做的话,就意味着,所有这样非最小属性的关键词都要被去掉,才能 保证最大限度不会这种类似的问题,改词库后还需要重建索引,变动比较大,而且比较不灵活。 (2)改匹配方式: 有人说AND关系不行,那就OR呗,没错,用OR确实可以搜索出来,但是,这样以来无论搜什么, 搜索结果命中数量就会变的异常巨大,尤其是在关键词越长,总数据量大的情况下,对用户体验和搜索性能都不是 最好的选择。这时才会发现无论你怎么改,都有引发一些新的问题,所以搜索引擎对中文检索来说,如果能保证90%的搜索效果是最优的, 就已经是非常不错的结果了,下面接着谈: 既然AND+OR+修改词库的方式,都不太理想,那么我们采取一种折中的方式,来优化查询结果呢? 答案是肯定的,Lucene/Solr/ElasticSearch有一种 按照term匹配个数,来优化查询结果的方式,并且可以限制不同个数的采取不同的匹配方式,散仙在前面的文章,也分析过,这里不在详细展开, 有兴趣可以访问 \[url\]http://qindongliang.iteye.com/blog/2302483\[/url\] 地址,查看此文章。这里大概描述下处理思路: 对于短文本关键词分词后term个数小于3的,我们采用精确匹配 对于中文本关键词分词后term个数大于3小于9的,我们乐观模式的缺减匹配,至多允许一个词不一致 对于长文本关键词分词后term个数大于10的,我们悲观模式的缺减匹配,至少允许一个词不一致 尽量保证在查准和召全之间的得到一个平衡,当然这需要不断调试,探索,改进才能得出来,并非泛泛而谈。 案例二: 业务定义,有限公司和有限责任公司应该是相同的意思,搜索的时候,可互相搜索出来,比如 搜A:小米科技有限公司 要求能搜到 小米科技有限责任公司 搜B:小米科技有限责任公司 要求能搜到 小米科技有限公司 有人说这很简单,直接把有限公司和有限责任公司作为同义词映射不就行了,这是一种办法,然而依旧解决不了这种问题。 why? 同义词映射应用在精确查询的字段上,没有啥问题,但现在要求映射在分词字段上,而且,有限公司和有限责任公司并不是不可再分的 属性了,他们还可以切分更细粒度的关键词,我们在solr中,看下他们的分词效果: \[/size\] \[img\]http://dl2.iteye.com/upload/attachment/0118/2218/86307e67-9f61-36d1-8c8c-73819b2e1009.png\[/img\] \[img\]http://dl2.iteye.com/upload/attachment/0118/2220/32cc2efd-5914-31e4-8b3a-6152e8284933.png\[/img\] \[size=medium\] 从上面的截图中,可以看出,在匹配方式,设置为AND的时候,从A可以搜到B,但反过来就不行了,B是搜不到A的, 因为他们还可以再切分,如何解决? 这种情况下改词库也解决不了,你不可能将有限公司和有限责任公司保留,而细粒度的关键词去掉,这样的话,召全率就会出现问题 比较好的解决办法是: (1) 匹配方式更改,正如案例一种的场景,我们可以允许term中,有1到2个term词不匹配,这样的话,就可以互相搜到,但是可能 在召全率上提升,查准率上有所下降,因为他们本来就是相生相克的关系,一个率升高,另一个率必然下降。 (2)进行数据归一化处理,我们知道在英文搜索中,一个单词可能有单数形式,复数形式,现在时,过去时等等等等,搜索引擎不关注你的七十二变, 只需要归一化到最原始的状态,然后索引起来,在搜索时候同样归一化,这样以来,无论你有多少种变化方式,在搜索引擎看来,就有只有一种原始 状态,把复杂的问题简单化,然后操作,是不错的一种处理方式,反映到这个例子中,我们可以使用同样的办法,比如有限责任公司,在索引和搜索的时候 统一归一化成有限公司检索,这样既能保证查全也保证了查准,当然需要我们额外做的,就是在数据规则上多下点功夫,然后不断完善我们的搜索系统。 总结: 文章简单剖析了,上面两种case造成的原因以及和他们的一些解决方法,当然这只是众多的问题中的几个例子,此外,任何一类问题的解决,都会可能引起新的问题,所以我们还是要具体问题,具体分析,能简单解决,就不要使用复杂的策略,更不要南辕北辙,忘了初心。 \[/size\] \[b\]\[color=green\]\[size=large\] 有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。 \[/size\]\[/color\]\[/b\] \[img\]http://dl2.iteye.com/upload/attachment/0104/9948/3214000f-5633-3c17-a3d7-83ebda9aebff.jpg\[/img\]
相关 Java反射机制问题:真实案例分析 在Java编程中,反射机制是一个强大的工具。它允许我们在运行时检查类、方法和字段的信息,而无需预先知道它们。 以下是一个关于Java反射机制的真实案例: 1. **创建对象 - 日理万妓/ 2024年09月12日 17:09/ 0 赞/ 20 阅读
相关 理解Java内存泄漏问题:案例分析 Java内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,导致系统可用内存不断减少,严重影响系统的稳定性和性能。 下面是一个简单的Java内存泄漏案例分析: 案例一: 清疚/ 2024年09月11日 23:18/ 0 赞/ 26 阅读
相关 Java内存管理:问题案例分析 在Java的内存管理中,有一些常见的问题和案例。下面我将为你解析几个典型的问题: 1. **内存泄漏**: 案例:一个全局变量,用于存储对象引用,但忘记将其设置为nul 心已赠人/ 2024年09月11日 14:30/ 0 赞/ 11 阅读
相关 机器学习交叉验证和网格搜索案例分析 目录 1 什么是交叉验证(cross validation) 1.1 分析 1.2 为什么需要交叉验证 2 什么是网格搜索(Grid 蔚落/ 2024年04月06日 11:42/ 0 赞/ 36 阅读
相关 Java||继承--案例分析--发红包问题 综合案例:群主发普通红包 群主发普通红包。某群有多名成员,群主给成员发普通红包。普通红包的规则: 1. 群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取。 淡淡的烟草味﹌/ 2023年01月10日 14:41/ 0 赞/ 135 阅读
相关 使用 MAT 排查分析 OOM 问题案例 MAT 相信有一定经验的开发者多少都会在生产环境上碰到过内存溢出(OOM)的问题吧。对于排查 OOM 问题、分析程序堆内存使用情况,最好的方式就是分析堆转储。 Java 朴灿烈づ我的快乐病毒、/ 2022年11月27日 03:24/ 0 赞/ 153 阅读
相关 Lucene/Solr/ElasticSearch搜索问题案例分析 ![133a7e24-46e8-3060-9018-bfe45e2381cd.jpg][] 最近收集的两个搜索的case,如下: 案例一: 系统管理员/ 2022年09月21日 15:19/ 0 赞/ 118 阅读
相关 Lucene/Solr/ElasticSearch搜索问题案例分析 \[img\]http://dl2.iteye.com/upload/attachment/0118/2222/133a7e24-46e8-3060-9018-bfe45e23 野性酷女/ 2022年04月11日 05:45/ 0 赞/ 199 阅读
还没有评论,来说两句吧...