Solr的中英文分词实现

对于Solr应该不需要过多介绍了,强大的功能也是都体验过了,但是solr一个较大的问题就是分词问题,特别是中英文的混合分词,处理起来非常棘手。 虽然solr自带了支持中文分词的cjk,但是其效果实在不好,所以solr要解决的一个问题就是中文分词问题,这里推荐的方案是利用ik进行分词。

ik是较早作中文分词的工具,其效果也是得到多数用户认同。但是现在作者似乎更新缓慢,对于最新的solr4.4支持不好,最新的更新也停留在2012年。

虽然不支持4.4版本(这也不是作者的错,solr的lucene的新版本接口都进行了修改,除非修改实现不然就没法向下兼容),但是我们也有办法的,我们可以利用他的分词工具自己封装一个TokenizerFactory,通过实现最新的4.4接口就可以让solr4.4用上ik了。

首先就是就在下载ik的原码,最新版是 然后自己实现一个TokenizerFactory:

package org.wltea.analyzer.lucene;

import java.io.Reader;
import java.util.Map;

import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.util.TokenizerFactory;
import org.apache.lucene.util.AttributeSource.AttributeFactory;

public class IKAnalyzerTokenizerFactory extends TokenizerFactory{

    private boolean useSmart;

    public boolean useSmart() {
        return useSmart;
    }

    public void setUseSmart(boolean useSmart) {
        this.useSmart = useSmart;
    }

    public IKAnalyzerTokenizerFactory(Map<String, String> args) {
        super(args);
        assureMatchVersion();
        this.setUseSmart(args.get("useSmart").toString().equals("true"));
    }

    @Override
    public Tokenizer create(AttributeFactory factory, Reader input) {
        Tokenizer _IKTokenizer = new IKTokenizer(input , this.useSmart);
        return _IKTokenizer;
    }

}

然后重新打包jar放到solr的执行lib里,同时新建一个fieldType

<fieldType name="text_ik" class="solr.TextField" >
  <analyzer type="index">
    <tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerTokenizerFactory" useSmart="false"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerTokenizerFactory" useSmart="true"/>
  </analyzer>
</fieldType>

测试一下我们新的分词器:

// 输入
移动互联网

// 输出
移动,互联网,互联,联网

从结果来看,其效果还是比较不错的。

搞定了中文我们需要搞定英文 英文简单的分词是按照空格,标点,stopword等来分词。 比如I‘m coding一般可以分词为I‘m, coding或者I, m, coding。一般情况下这样也是可以接受的,但是如果用户输入code,是否应该搜到结果呢,如果要搜到该结果,那么我们需要处理我们的英文分词。

这里提供一种简单的实现,就是采用NGramFilterFactory,该过滤器简单的按照长度对词进行切分,该过滤器有两个参数minGramSizemaxGramSize,分别表示最小和最大的切分长度,默认是12

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/>
</analyzer>

比如设置(min,max)为(3,5),我们上面的句子“I‘m coding”会得到以下的结果:

I‘m,cod,codi,codin,coding,odi,odin,oding,din,ding,ing

当然这里也会有问题,就是小于3个词长的都会被过滤调,特别是中文和英文采用的是同一词长处理,如果min设为3,那么像我,我们这样的都会被过滤,解决办法就是min设为1,这样的结果就是会大大增加索引记录。影响检索速度。好处就是可以实现字母级别的匹配,然后通过设置匹配度阔值提升了搜索质量。

分别处理完了中文和英文,那么就要混合中英文处理了

  • 方案一是使用StandardTokenizerFactory和NGramFilterFactory,加上辅助的StopFilterFactory和LowerCaseFilterFactory等过滤器处理。也就是中文默认是按字逐个分开,当然前提是NGramFilterFactory的minGramSize要设置为1。
  • 方案二则是IKAnalyzerTokenizerFactory和NGramFilterFactory,通过ik实现对词的索引,然后在通过ngram进行长度分割。即在方案一的基础上增加对词的索引,提升索引质量。
  • 方案一和方案二如果还不够和谐的,那么我们还有个办法就是自定义的反感三,所谓自定义,自己写个tokenizer或者filter不就可以了,而且这一点也不复杂,这里就不细说了,有机会再专门写一个。

最后来个整合的配置参考一下:

<fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerTokenizerFactory"  useSmart="false"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="20"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerTokenizerFactory"  useSmart="true"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="10"/>
  </analyzer>
</fieldType>

这里所提出的并不是最优的方案,或者说可能是比较傻瓜化的方案,但是solr的优势就是自由,你可以自己组合各种tokenizer和filter来实现你要的效果,或者干脆自己去实现tokenizer和filter,然后让强大的solr服务于你的项目。

参考:

时间: 2024-12-16 01:34:15

Solr的中英文分词实现的相关文章

[Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例二.

为了更好的排版, 所以将IK分词器的安装重启了一篇博文,  大家可以接上solr的安装一同查看.[Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一: http://www.cnblogs.com/wang-meng/p/5814798.html 8, 打开浏览器查看solr可视化界面 到了这里solr就配置好了, 可是我们的IK 分词器还没有配置呢, 如果不配IK分词器的话 它是怎样分词的呢? 我们就来先看一下:  每个字都分成了一个词, 这当然不是我们想要的结果

PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))

PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索 中文分词: a)   robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robbe.html i.  Robbe完整版本下载:Robbe完整版本(PHP测试程序, 开发帮助文档, WinNT下php各版本的dll文件)下载: http://code.google.com/p/robbe(“谷歌”无法使用) b) SCWS(简易中文分词) 基于HTTP/POST的分词 : htt

Solr安装ik分词

下载http://git.oschina.net/wltea/IK-Analyzer-2012FF 解压之后将dist/IKAnalyzer2012FF_u1.jar复制到tomcat的solr的lib文件夹下 将IKAnalyzer.cfg.xml和stopword.dic复制到solr/home的collection1\conf文件夹下 打开schema.xml,在<fieldType>附近添加 <fieldType name="text_ik" class=&q

Solr配置中文分词器IKAnalyzer及增删改查调用

一.配置IKAnalyzer中文分词器 Solr 版本5.2.1 IKAnalyzer2012_u6.jar报错 ,用IKAnalyzer2012_FF_hf1.jar 替换可解决 解决lucene4.0与IKAnalyzer的冲突.解决Exception in thread "main" java.lang.VerifyError: class org.wltea.analyzer.lucene.IKAnalyzer overrides final method tokenStrea

Solr配置中文分词器mmseg4j详解

针对solr的分词器比较多,其中最常用的的两个是mmseg4j和ik-analyzer,至于他们的区别可以网上查找比较下,这两个分词器都挺好用.我搭建的solr环境(上一篇)是4.10.3的最新版本,以下将详细说下mmseg4j的配置. 1.首先下载对应的jar包. 版本号一定要对应上否则可能会报错,下载地址为:http://code.google.com/p/mmseg4j/ 但是这个网址好像需要翻墙,所以大家可以到我的上传资源下载:http://download.csdn.net/downl

第二步solr配置中文分词IK Analyzer

1.下载IK Analyzer 2012FF_hf1.zip解压如下图:注解(IK Analyzer 2012才能支持solr4.0以上的版本) 下载地址:http://pan.baidu.com/s/1c0nMOhE 2.添加IK Analyzer 2012 FF 中文分词:把IKAnalyzer2012_FF文件夹IKAnalyzer2012_FF.jar放在tomcat1.6,webapps\solr\WEB-INF\lib的目录下,修改E:\solr\collection1\conf\s

[Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一.

在这里一下讲解着三个的安装和配置, 是因为solr需要使用tomcat和IK分词器, 这里会通过图文教程的形式来详解它们的安装和使用.注: 本文属于原创文章, 如若转载,请注明出处, 谢谢.关于设置IK分词器的文章 IK分词器: http://www.cnblogs.com/wang-meng/p/5814798.html 1, 解压tar文件首先我们在根目录下建立一个solr目录(使用命令: mkdir /solr):  然后查看目录是否生成成功:  解压solr/tomcat/IK 到sol

Solr配置中文分词器IK Analyzer详解

配置的过程中出现了一些小问题,一下将详细讲下IK Analyzer的配置过程,配置非常的简单,但是首先主要你的Solr版本是哪个,如果是3.x版本的用IKAnalyzer2012_u6.zip如果是4.x版本的用IK Analyzer 2012FF_hf1.zip,一定要对应上,要不然会配置失败.以下是详细步骤: 1.下载IK Analyzer. 下载地址为:http://code.google.com/p/ik-analyzer/downloads/list 但是由于本国国情,需要翻墙才能下载

Solr和IK分词器的整合

IK分词器相对于mmseg4J来说词典内容更加丰富,但是没有mmseg4J灵活,后者可以自定义自己的词语库.IK分词器的配置过程和mmseg4J一样简单,其过程如下: 1.引入IKAnalyzer.jar包到solr应用程序的WEB-INF/lib/目录下 2.打开solr的home/conf目录下的schema文件,在<types></types>内加入如下代码: <fieldType name="text_zh" class="solr.Te