`
wb284551926
  • 浏览: 552813 次
文章分类
社区版块
存档分类
最新评论

Solr的中英文分词实现(转载)

    博客分类:
  • solr
阅读更多

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

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

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

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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

 

1
2
3
4
5
6
7
8
<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,该过滤器简单的按照长度对词进行切分,该过滤器有两个参数minGramSize和maxGramSize,分别表示最小和最大的切分长度,默认是1和2。

 

1
2
3
4
<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不就可以了,而且这一点也不复杂,这里就不细说了,有机会再专门写一个。

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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服务于你的项目。

参考:

原文链接:http://thinkjet.me/solr-lucene-tokenizer-filter.html

分享到:
评论

相关推荐

    solr 5.x 和 6.x 最新中文分词器

    下面将详细介绍Solr中的中文分词器及其相关知识。 一、Solr中文分词器概述 在处理中文文档时,由于中文句子没有明显的分隔符,如英文的空格,因此需要使用分词器进行预处理。Solr支持多种中文分词器,如IK Analyzer...

    solr7.3.1中文分词器

    描述中提到的"solr7.3.1种需要的中文IK分词器",IK(Intelligent Chinese Analyzer)分词器是一个强大的、成熟的中文分词组件,广泛应用于各种Java开发的搜索系统中。IK分词器支持多种分词模式,包括精确模式、全...

    solr中文分词器

    中文分词器的引入解决了英文分词相对简单,而中文以字为基本单位,需要特殊处理才能正确切分的问题。 一、Solr简介 Apache Solr是一款开源的企业级搜索平台,基于Java开发,它可以提供高效的全文检索、 faceted ...

    solr 中文分词

    Solr 内置了多种分词器,包括 StandardTokenizer(主要针对英文)等,但它们对中文的支持有限。为了实现中文分词,通常需要使用第三方分词库,如IK Analyzer、SmartChineseAnalyzer、HanLP、jieba分词等。 3. **IK...

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

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

    solr ik分词器

    本教程将详细解释如何在Solr中安装和使用IK分词器。 首先,让我们理解一下什么是分词器。在文本检索和自然语言处理领域,分词是将连续的文本分解成有意义的词语单元(如单词或短语)的过程。对于中文,由于没有明显...

    solr 3.4 中文分词配置问题

    在这个版本中,由于Solr主要支持英文分词,因此配置中文分词器需要额外的设置工作。这篇博客“solr 3.4 中文分词配置问题”很可能详细介绍了如何在Solr 3.4中为中文内容进行有效的分词处理。 首先,我们需要理解...

    solr-4.10.3+ik分词器

    在标题“solr-4.10.3+ik分词器”中,我们看到的是Solr的一个具体版本——4.10.3,以及与之配合使用的IK分词器。这个版本的Solr包含了多项优化和改进,例如更稳定的性能、增强的搜索特性以及对各种数据源的更好支持。...

    solr5配置中文分词

    在Solr中,Analyzer是处理文本输入的组件,它负责将输入的文本转换为可搜索的术语。对于中文,我们需要一个能理解并处理中文语法和词汇的分词器。IK Analyzer是一个流行的中文分词工具,专为Java设计,适用于Lucene...

    solr中文分词器ik-analyzer-solr7.x

    在Solr中,分词器是核心组件之一,负责对输入的中文文本进行分词处理,生成可以被索引和查询的关键词。IK Analyzer作为Solr的插件,可以实现以下功能: 1. **中文分词**:通过内置的中文词典,将输入的中文句子拆分...

    solr分词器

    在Solr中,有多种内置的分词器可供选择,如StandardTokenizer(标准分词器)和IK Analyzer(智能中文分词器)。以IK Analyzer为例,它是专门为中文设计的分词器,能够处理复杂的中文词汇切分问题。IK Analyzer支持...

    solr7.x-ik分词器亲测可用.zip

    - 内置了英文分词,对于混合中英文的文本处理也较为友好。 - 提供了智能和精确两种分词策略,智能模式下能自动识别词语边界,精确模式下力求对每个词进行最精确的切割。 - 支持多线程并行分词,提升处理速度。 - ...

    solr中文分词器技术

    中文分词技术(中文分词原理)词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文信息处理的...

    Solr5.5搜索引擎之分词原理说明.docx

    在 Solr5.5 中中文分词可以使用 Lucene 的分词器,例如 StandardTokenizerFactory、CJKTokenizerFactory 等。这些分词器可以根据不同的语言和需求进行选择和配置。 Solr5.5 搜索引擎之分词原理说明对于开发者自定义...

    lucene、solr中文分词器

    总之,为了在Lucene和Solr中实现有效的中文全文搜索,选用合适的中文分词器至关重要。这些分词器不仅解决了Lucene默认分词器对中文处理的不足,而且通过提供更准确的分词结果,极大地提升了中文搜索的精度和用户体验...

    solr与IK分词器

    通过这些步骤,我们可以有效地集成 IK 分词器到 Solr 中,从而实现更精准的中文分词,提高搜索引擎的检索效果。对于中文信息检索和分析应用,合理的分词策略至关重要,因为中文词语的边界不像英文那么明显,正确的...

    Solr java分词器

    标题中的“Solr java分词器”指的是Apache Solr中使用的Java实现的分词工具,主要负责对输入的文本进行词汇分析,以便于索引和搜索。Solr是一款基于Lucene的开源搜索引擎,它提供了更高级别的API和配置选项,包括...

    JAVA+Solr分词项目工程实例Java源码

    这个项目工程实例是关于如何使用Java与Solr进行集成,实现分词搜索功能的示例。Solr提供了强大的文本分析、索引和查询能力,广泛应用于内容管理系统、电子商务网站、新闻门户等场景。 1. **Solr简介** - Solr是...

Global site tag (gtag.js) - Google Analytics