`
qindongliang1922
  • 浏览: 2171112 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117076
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125422
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59491
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71017
社区版块
存档分类
最新评论

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),在后台留言咨询。
技术债不能欠,健康债更不能欠, 求道之路,与君同行。



  • 大小: 21.5 KB
  • 大小: 19.1 KB
  • 大小: 10.2 KB
  • 大小: 10.8 KB
  • 大小: 71.6 KB
0
0
分享到:
评论

相关推荐

    Solr Elasticsearch lucene 搜索引擎

    Solr、Elasticsearch和Lucene是三个在搜索引擎领域中至关重要的技术,它们共同构建了现代数据检索的基础架构。下面将分别对这三个组件进行详细解释,并探讨它们之间的关系。 **Lucene** Lucene是一个高性能、全文本...

    搜索引擎 Lucene、Solr

    5. Solr是一个基于Lucene构建的企业级搜索服务器,它提供了搜索引擎的索引、搜索、排序等功能,并通过RESTful API与各种客户端进行交互。Solr在实现搜索引擎方面,不仅继承了Lucene的强大功能,还提供了分布式搜索、...

    ubuntu下solr7的ik分词及配置使用

    IK分词器(Intelligent Chinese Analyzer for Solr)是针对Solr和Elasticsearch设计的中文分词组件,能够对中文文本进行智能分词,提升中文检索的精确度。 首先,确保你的Ubuntu系统已经安装了Java环境,因为Solr...

    es与solr的区别_solr_ES_es与solr的区别_elasticsearch_

    在大数据和搜索引擎领域,Elasticsearch (ES) 和 Apache Solr 都是广泛使用的开源技术,它们都基于 Lucene 库,提供高性能、可扩展的全文搜索和分析能力。然而,两者在设计哲学、使用场景、功能特性以及社区支持等...

    ES和solr搜索方案对比

    ES(ElasticSearch)和Solr都是基于Lucene的搜索引擎,它们各自提供了一套搜索框架,用于实现高效的全文搜索功能。由于两者都是在Apache License 2下开源的,因此在选择使用哪种搜索方案时,需要根据不同的使用场景...

    搜索引擎选择: Elasticsearch与Solr - 叽歪.pdf

    在搜索引擎领域,Elasticsearch与Solr是两款被广泛使用且具有代表性的开源全文搜索引擎。它们都基于Apache Lucene构建,提供了强大的搜索引擎功能。在进行搜索引擎选择时,对比Elasticsearch与Solr可以帮助我们更好...

    jcseg,Jcseg 是基于 mmseg 算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于 Jetty 的 web 服务器,方便各大语言直接 http 调用,同时提供了最新版本的 lucene, solr, elasticsearch 的分词接口!.zip

    lucene, solr, elasticsearch 的分词接口!Jcseg自带了一个 jcseg.properties 文件用于快速配置而得到适合不同场合的分词应用,例如:最大匹配词长,是否开启中文人名识别,是否追加拼音,是否追加同义词等!

    luke-6.6.0

    Luke:用于Lucene / Solr / Elasticsearch索引的GUI工具;具体参考:https://blog.csdn.net/fly910905/article/details/81190382

    lucene4.10.4 jar,手动整理,去除其他文件

    10. **分布式搜索**:通过Solr或Elasticsearch等项目,Lucene可以扩展到分布式环境,支持大规模数据的搜索需求。 "lucene4.10.4.jar"文件是实现以上所有功能的基础,开发者可以将这个库引入项目中,构建自己的全文...

    solr-zookeeper-tomcat集群搭建

    Ik Analyzer是一款开源的、基于Java实现的中文分词器,常用于Solr和Elasticsearch等全文搜索引擎的中文处理。在Solr中使用Ik Analyzer,你需要: 1. 将ik-analyzer解压到Solr的lib目录下。 2. 在schema.xml中定义一...

    Solr和ElasticSearch分析比较.docx

    Solr 和 ElasticSearch 分析比较 Solr 和 ElasticSearch 是两种流行的搜索引擎,都是基于 Apache Lucene 库的开源搜索引擎。在选择搜索引擎时,需要了解它们的优缺点和比较。 Solr 的优缺点 Solr 是一个成熟、...

    搜索引擎 solr stopword 停词表

    Elasticsearch则是在Solr和Lucene的基础上构建的分布式、RESTful风格的搜索和分析引擎,广泛应用于日志分析、实时监控和复杂数据分析等领域。Elasticsearch同样支持停词过滤,并且提供了多种内置的分词器和Analyzer...

    elasticsearch-analysis-rosette:适用于Elasticsearch的Rosette Analysis插件

    适用于Elasticsearch的Rosette分析介绍Rosette Analysis插件将Lucene分析模块集成到elasticsearch中。 这些模块封装了(Rosette)。 有关更多信息,请参阅《 Rosette语言学平台应用程序开发人员指南:Lucene / Solr...

    lucene-solr-talk:我在 JUG Karlsruhe 演讲的示例代码

    Lucene、Solr 和 Elasticsearch 的演示应用程序 该存储库包含我用于讨论 、 和的示例代码。 它由一个子项目 lucene 组成,其中包含使用 Lucene 进行索引和搜索的逻辑。 子项目 solr-indexer 用于索引正在运行的 Solr...

    Solr和ElasticSearch全文检索客户端代码

    Elasticsearch 是一个实时分布式搜索和分析引擎,同样基于 Lucene,但提供了更高级别的抽象和更多功能,如自动分词、近实时搜索、多租户、集群管理等。 **2. Elasticsearch 的 Java REST 客户端** Elasticsearch ...

    solr与IK中文分词器的安装包及配置

    Solr是Apache软件基金会开发的一款高性能、全文搜索引擎服务器,它基于Lucene库,提供了一种分布式、可扩展、高可用的搜索和分析平台。而IK中文分词器(IK Analyzer)则是针对中文处理的一种开源分词组件,尤其适合...

    (狂神)ElasticSearch快速入门笔记,ElasticSearch基本操作以及爬虫(Java-ES仿京东实战)

    好记性不如烂笔头哦~,ElasticSearch,简称es,es是一个开源的高拓展的分布式全文搜索引擎它可以近乎实时的存储、检索数据;本身拓展性很好,可以拓展到上百台服务器,处理PB级别的数据。es也是用Java开发并使用...

    7_Elasticsearch笔记.pdf

    Elasticsearch是基于Lucene的开发的搜索引擎,它支持分布式、多用户访问,可以轻松的扩展到上百台服务器,是近实时的搜索引擎,而不是实时的搜索引擎。Elasticsearch通过简单的RESTful API来隐藏Lucene的复杂性,...

Global site tag (gtag.js) - Google Analytics