`

solr4.7.2+mmseg2.0+pinyinAnalyzer实现拼音、简拼检索

阅读更多

生产环境:

solr4.7.2

jdk1.6

lucene4.7.2

mmseg4j-core-1.10 (https://github.com/chenlb/mmseg4j-core.git)

mmseg-solr-2.0 (https://github.com/chenlb/mmseg4j-solr.git)

pinyin4j-2.5.0

pinyinAnalyzer (https://github.com/liangbaolin/pinyinAnalyzer.git)

说明:

  1. 由于mmseg4j本身对max-word模式下分词做了最小只能是2个词的限制,而作者又没有好的办法,所以我们针对自身应用做了一些调整
  2. 由于pinyinAnalyzer是针对solr5.0以上的版本,所以我们对其源码做了调整,将其整合到了4.7.2中;
  3. 由于pinyinAnalyzer中转换拼音简称的时候使用的是pinyin4j包中的getPinyinShortCollection方法,而该方法输出简拼时会多输出一个字母(如:“重庆”的输出为[cq,zq,c,z],而其中的单个字母对索引影响极大);因此将其替换为getPinyinShort方法(如:“重庆”的输出为cq,zq)
 

pinyinAnalyzer源码修改:(这里只列主要的PinyinTokenFilter.java)



需求:

  1. 需要搜索拼音能搜到对应企业,如搜索”xiaomi”可以查询出“小米通讯技术有限公司”
  2. 搜索“xiaomi”可以高亮汉字“小米”
  3. 可以使用拼音简称搜索,如搜索“cq”或“zq”可以搜到包含“重庆”的数据

方案分析:

开始考虑两种方案:

方案一:在应用中将中文搜索词转为拼音,对于关键词统一以英文或拼音的形式搜索

方案二:通过分词手段,在建立索引时直接将分词后的关键词对应的全拼(包括多音字全拼)、简拼(如cq,zq)一并写入索引;

              查询时,只需要以同样规则将搜索词分词后再加入拼音,这样既可以搜索中文,又可以搜索拼音

说明:因为方案二的调整仅限于索引层面,而对应用本身毫无影响,所以最终选择方案二

 

前期含拼音分词测试:

1.分析词“重庆”、查询词“重庆”,分析结果如下:


2.分析词“重庆”、查询词“cq”,分析结果如下:

3.分析词“重庆”、查询词“chongqing”,分析结果如下:

 

solr配置:

1.将修改过源码的pinyinAnalyzer.jar、msseg4j-core.jar放于solr4.7.2对应lib目录

2.将pinyin4j-2.5.0.jar放于solr4.7.2对应目录下

3.配置schema.xml:

   a.定义字段类型

   <fieldType name="text_mmseg4j_pinyin" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false" >

        <analyzer type="index">

            <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="dic"/>

            <filter class="utn.index.mmseg.solr.PinyinTokenFilterFactory"  minTermLength="2" pinyinAll="true"  outChinese="true"/>

        </analyzer>

        <analyzer type="query">

            <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="dic"/>

            <filter class="utn.index.mmseg.solr.PinyinTokenFilterFactory"  minTermLength="2" outChinese="true" pingyinAll="true"/>

        </analyzer>

    </fieldType>

   b.将对应field的type改为text_mmseg4j_pinyin

   c.重启solr

 

修改后的源码及jar包见附件

  • 大小: 168.9 KB
  • 大小: 118.5 KB
  • 大小: 105.9 KB
  • 大小: 112.1 KB
分享到:
评论
4 楼 冰糖葫芦 2017-12-02  
事无休 写道
冰糖葫芦 写道
事无休 写道
首先谢谢博主的分享。现在我有两个问题:
第一:更新拼音索引是成功了,但是查询的时候,根据拼音查询查询不出结果。
第二:analysis中query的时候输入chongqingdami,index中是重庆大米,拼音并没有分词,所以索引不到。还请楼主帮忙解答,谢谢。


你好,
1.问题1不太清楚你意思
2.问题2私以为有几种解决方案:
   一:搜不到时给用户提示加空格,比如输入“chongqing dami”(不包含引号)
   二:使用EdgeNGramFilterFactory来对原词做切分后转拼音
   三:实现拼音分词
以上三种方法由易到难

当然@事无休 有啥更好方式欢迎交流。


谢谢博主解答,十分感谢。
关于第二种或者第三种方法楼主是否有完整的例子供参考呢,我是刚接触solr,不清楚怎么实现。
关于第二种,jar包里面是存在EdgeNGramFilterFactory这个类的,是配置文件里面直接配置好就可以使用了么?还是说怎么去处理?还请麻烦楼主解答,如果有实例还请博主帮忙。


第二种实现说明:
1.schema定义如下:
<fieldType name="text_just_pinyin" class="solr.TextField" autoGeneratePhraseQueries="false" positionIncrementGap="100">
    <analyzer type="index">
	    <!--<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="dic"/>-->
	    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
	    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
	    <filter class="utn.index.mmseg.solr.PinyinTokenFilterFactory"  minTermLength="2" outChinese="true" pingyinAll="true"/>
    </analyzer>
    <analyzer type="query">
	    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
	    <filter class="utn.index.mmseg.solr.PinyinTokenFilterFactory"  minTermLength="2" outChinese="true" pingyinAll="true"/>
   </analyzer>
</fieldType>

2.效果:
a.查询词效果图如下:

b.索引效果图如下:

注意:
红框中效果即为EdgeNGramFilterFactory效果
c.说明:
1)这种效果并不能替代中文分词,所以你需要为查询字段在schema.xml中创建两个字段(如商品名称对应到schema中分别为商品名称1、商品名称2,这两字段都存放的是商品名称,只不过采用不同的分词策略)
2)查询的时候只要同时去匹配两个字段就行(或者用copy将连个字段copy至同一个字段)

图已上传到相册了,如果不能看直接去我相册看吧

3 楼 事无休 2017-11-27  
冰糖葫芦 写道
事无休 写道
首先谢谢博主的分享。现在我有两个问题:
第一:更新拼音索引是成功了,但是查询的时候,根据拼音查询查询不出结果。
第二:analysis中query的时候输入chongqingdami,index中是重庆大米,拼音并没有分词,所以索引不到。还请楼主帮忙解答,谢谢。


你好,
1.问题1不太清楚你意思
2.问题2私以为有几种解决方案:
   一:搜不到时给用户提示加空格,比如输入“chongqing dami”(不包含引号)
   二:使用EdgeNGramFilterFactory来对原词做切分后转拼音
   三:实现拼音分词
以上三种方法由易到难

当然@事无休 有啥更好方式欢迎交流。


谢谢博主解答,十分感谢。
关于第二种或者第三种方法楼主是否有完整的例子供参考呢,我是刚接触solr,不清楚怎么实现。
关于第二种,jar包里面是存在EdgeNGramFilterFactory这个类的,是配置文件里面直接配置好就可以使用了么?还是说怎么去处理?还请麻烦楼主解答,如果有实例还请博主帮忙。
2 楼 冰糖葫芦 2017-11-25  
事无休 写道
首先谢谢博主的分享。现在我有两个问题:
第一:更新拼音索引是成功了,但是查询的时候,根据拼音查询查询不出结果。
第二:analysis中query的时候输入chongqingdami,index中是重庆大米,拼音并没有分词,所以索引不到。还请楼主帮忙解答,谢谢。


你好,
1.问题1不太清楚你意思
2.问题2私以为有几种解决方案:
   一:搜不到时给用户提示加空格,比如输入“chongqing dami”(不包含引号)
   二:使用EdgeNGramFilterFactory来对原词做切分后转拼音
   三:实现拼音分词
以上三种方法由易到难

当然@事无休 有啥更好方式欢迎交流。
1 楼 事无休 2017-11-24  
首先谢谢博主的分享。现在我有两个问题:
第一:更新拼音索引是成功了,但是查询的时候,根据拼音查询查询不出结果。
第二:analysis中query的时候输入chongqingdami,index中是重庆大米,拼音并没有分词,所以索引不到。还请楼主帮忙解答,谢谢。

相关推荐

    Solr3.2 + mmseg4j-1.8.4中文搜索引擎_Demo

    Solr3.2 + mmseg4j-1.8.4中文搜索引擎Demo是一个演示项目,旨在展示如何在Solr3.2版本中结合mmseg4j实现高效的中文搜索功能。Solr是Apache软件基金会开发的一个开源全文搜索引擎,它提供了一个分布式、可扩展且高度...

    tomcat+solr3.6+mmseg4j

    本教程将详细介绍如何在Tomcat中整合Solr3.6版本,并引入MMSEG4J中文分词库,实现高效的中文文本处理。 【Solr3.6核心概念】 1. **SolrCloud**:Solr3.6引入了分布式搜索和管理功能,称为SolrCloud,提供了...

    solr4.7.2服务器tomcat集成

    Solr4.7.2是Solr的一个版本,它包含了许多优化和改进,使得在处理大数据量时更加高效稳定。Tomcat7则是一个流行的Java Servlet容器,用于部署和运行Java Web应用程序。将Solr与Tomcat集成,可以利用Tomcat的管理和...

    ik+mmseg分词器

    `IK Analyzer` 和 `MMSEG` 分词器是两个广泛使用的工具,它们在 Solr(一个强大的全文搜索引擎)中发挥着重要作用。本篇文章将深入探讨这两个分词器以及它们在 Solr 6.1 版本中的应用。 首先,`IK Analyzer` 是一款...

    兼容solr4.10.3的mmseg4j-1.9.1分词器

    "兼容solr4.10.3的mmseg4j-1.9.1分词器" 这个标题表明我们正在讨论的是一个针对Solr 4.10.3版本优化的mmseg4j分词器,版本号为1.9.1。mmseg4j是一款广泛使用的Java实现的中文分词库,它提供了高效且精准的中文分词...

    solr6配置mmseg4j

    在Solr6中配置mmseg4j是为了实现中文分词,从而提升搜索效果。mmseg4j是基于Java的一个高性能中文分词库,它提供了多种分词算法,如最长匹配、最短路径等,以满足不同的分词需求。 首先,我们需要理解Solr6的基本...

    ssm+shiro+solr7+mybatis逆向+maven多项目初步搭建测试

    几乎全新搭建ssm+shiro+solr7+mybatis逆向+maven多项目初步搭建测试,只是大致框架,接下来自己写,下面是linux 下solr7+tomcat8+IK中文分词器 环境 https://download.csdn.net/download/laysolitary/10686971

    solr6配置mmseg4j所需dic文件和jar包

    solr6配置mmseg4j所需dic文件和jar包,包括word.dic,mmseg4j-core-1.10.0.jar,mmseg4j-solr-2.3.0.jar

    solr4.1+IK中文分词

    Solr4.1 + IK中文分词是针对Apache Solr搜索引擎的一个重要组合,它使得在中文环境下进行全文检索和分析变得更加高效和精确。Apache Solr是一个开源的企业级搜索平台,基于Lucene库,提供了高性能、可扩展的全文索引...

    mmseg4j-solr-2.4.0.jar

    值得注意的是,mmseg4j-solr-2.4.0.jar中的mmseg4j-2.4.0子目录包含了mmseg4j的核心组件,包括分词算法的实现和相关的配置文件。开发者可以通过阅读源代码和文档,更深入地了解其工作原理和优化技巧。 总之,mmseg4...

    solr4.9+tomcat+zookeeper集群

    Solr是Apache Lucene项目的一个子项目,是一个高性能、全文本搜索服务器,广泛应用于各种大数据检索场景。在4.9版本中,Solr引入了集群功能,以支持高可用性和可扩展性。在这个集群环境中,Tomcat作为Servlet容器...

    solr+IK分词集成tomcat实现电商项目的全文检索

    压缩包内含有solr+ik如何配置的详细介绍以及solr+ik的包,省去了自己去找地址下载的麻烦,经测试使用完全可以在电商电商项目中实现全文检索

    在tomcat环境下搭建solr3.5和mmseg4j搜索引擎

    ### 在Tomcat环境下搭建Solr 3.5与MMSEG4J搜索引擎 #### 一、配置Solr环境 1. **下载Solr** - 访问官方下载页面:[http://www.apache.org/dyn/closer.cgi/lucene/solr/]...

    solr+IK分词集成tomcat实现全文检索

    Solr+IK分词集成Tomcat实现全文检索是构建高效搜索引擎的关键步骤,尤其在电子商务等大量数据检索场景中,这一技术的应用尤为重要。本教程将详细阐述如何通过Solr结合IK分词器,在Tomcat服务器上搭建一个功能完备的...

    solr+spring+hibernate+maven+webservice整合框架

    Solr+Spring+Hibernate+Maven+WebService整合框架是一个常见的企业级应用开发模式,它将搜索引擎Solr、持久层框架Hibernate、服务层框架Spring、构建工具Maven以及Web服务接口结合在一起,提供了一种高效、灵活的...

    solr 分词器 mmseg4j IKAnalyzer

    总之,mmseg4j 和 IKAnalyzer 都是 Solr 中用于中文全文检索的重要工具,它们各有特点,适用于不同的应用场景。选择哪个分词器取决于项目需求、性能要求以及团队对每个工具的熟悉程度。通过合理的配置和优化,可以...

    tomcat8+solr7.4+IK

    【标题】"Tomcat8+Solr7.4+IK"是一个在Linux环境下搭建的搜索引擎解决方案,其中包含了Apache Tomcat 8作为应用服务器,Solr 7.4作为搜索引擎核心,以及IK Analyzer作为中文分词工具。这个配置适用于需要处理大量...

    tomcat8.5+solr7+IKAnalyzer5+ikpinyin直装版

    【标题】"tomcat8.5+solr7+IKAnalyzer5+ikpinyin直装版" 提供了一个集成的搜索引擎环境,其中包含了Tomcat ...通过Solr的高级搜索功能,结合IKAnalyzer5和ikpinyin的中文处理能力,可以实现精准、便捷的全文检索服务。

Global site tag (gtag.js) - Google Analytics