`
san_yun
  • 浏览: 2665856 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

solr 的analyzer

    博客分类:
  • solr
 
阅读更多

下面是solr一个分词的配置,看不明白? 需要了解一下solr的Analyzers, Tokenizers, and Token Filters了。

 <fieldType name="text" class="solr.TextField"
                        positionIncrementGap="100" compressThreshold="1000">
                        <analyzer type="index">
                                <tokenizer class="solr.StandardTokenizerFactory" />
                                <filter class="solr.WordDelimiterFilterFactory"/>
                                <filter class="solr.LowerCaseFilterFactory" />
                        </analyzer>
                        <analyzer type="query">
                                <tokenizer class="solr.StandardTokenizerFactory" />
                                <filter class="solr.WordDelimiterFilterFactory"/>
                                <filter class="solr.LowerCaseFilterFactory" />
                        </analyzer>
                </fieldType>

 本文基于对此英文网页的理解http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters】

 概览

    当对一个文档(document是一系列field的集合)进行索引时,其中的每个field(document和file都是lucene中的概念)中的数据都会经历分析,分词和多步的分词过滤等操作。这一系列的动作是什么呢?直观的理解是,将一句话分成单个的单词,去掉句子当中的空白符号,去掉多余的词,进行同义词代换等等。

  【例】what a beautiful day? 会进行什么处理呢?what ,a 以及问号都将被去掉,最后处理结果为beautiful和day(也有可能是beautiful day)。

  不仅仅是在索引的时候进行这些工作,查询的时候也要做这些工作,而且通常索引和查询使用同样的方法来进行处理。这样做的目的是为了保证索引与查询的正确匹配。下例说明了采取不同的处理时的不匹配情况。

  【例】ABCD索引分词为AB  CD,查询时候分词为ABC  D,显然查询的匹配结果为0。

词性转换

  一种是将一个词扩展成它的多种形式,例如将run扩展成runs,running。另外一种是词性规约,例如将runns,running等都“收缩”成run。前者只需要在索引或查询的任意一端采用即可,后者需要在两端同时采用。

 
分析器(Analyzer)


   分析器是包括连个部分:分词器和过滤器。分词器顾名思意就是将句子分词单个的词,过滤器就是对分词的结果进行筛选,例如中文中将“的”“呀”这些对句子主体意思影响不大的词删除。英语中类似的就是"is","a"等等。通常在索引和分词两端应该采用同样的分词器。solr自带了一些分词器,如果你需要使用自己公司的分词器,那么就需要修改solr模式(Solr schema)。

    schema.xml 文件允许两种方式修改文本被分析的方式,通常只有field类型为 solr.TextField 的field的内容允许定制分析器。

    方法一:使用任何 org.apache.lucene.analysis.Analyzer的子类进行设定。

 

 fieldtype name="nametext" class="solr.TextField">
 
  <analyzer class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>

 </fieldtype>

 

 方法二:指定一个TokenizerFactory ,后面跟一系列的TokenFilterFactories(它们将按照所列的顺序发生作用),Factories被用来创建分词器和分词过滤器,它们用于对分词器和分词过滤器的准备配置,这样做的目的是为了避免the overhead of creation via reflection。

 

<fieldtype name="text" class="solrTextField">

   <analyzer>

     <tokenizer class="solrStandardTokenizerFactory"/>

     <filter class="solrStandardFilterFactory"/>

     <filter class="solrLowerCaseFilterFactory"/>

     <filter class="solrStopFilterFactory"/>

     <filter class="solrPorterStemFilterFactory"/>

   </analyzer>

 </fieldtype>

需要说明的一点是,Any Analyzer, TokenizerFactory, or TokenFilterFactory 应该用带包名的全类名进行指定,请确保它们位于Solr的classpath 路径下。对于 org.apache.solr.analysis.* 包下的类,仅仅通过solr.*就可以进行指定。

   如果你需要使用自己的分词器和过滤器,你就需要自己写一个 factory ,它必须是 BaseTokenizerFactory 或BaseTokenFilterFactory的子类。就像下面一样。

  public class MyCustomFilterFactory extends BaseTokenFilterFactory {

public TokenStream create(TokenStream input) {

    return new MyCustomFilter(input);

  }

}

 

Solr提供了哪些TokenizerFactories?
--------------------------------------------------------------------
1.  solr.LetterTokenizerFactory
   创建org.apache.lucene.analysis.LetterTokenizer.
   分词举例:
   "I can't" ==> "I", "can", "t"
2.  solr.WhitespaceTokenizerFactory
   创建org.apache.lucene.analysis.WhitespaceTokenizer
3.  solr.LowerCaseTokenizerFactory
   创建org.apache.lucene.analysis.LowerCaseTokenizer
   分词举例:
  "I can't" ==> "i", "can", "t"
4.  solr.StandardTokenizerFactory
   创建org.apache.lucene.analysis.standard.StandardTokenizer
   分词举例:  "I.B.M. cat's can't" ==>
ACRONYM: "I.B.M.", APOSTROPHE:"cat's", APOSTROPHE:"can't"
说明:该分词器,会自动地给每个分词添加type,以便接下来的对type敏感的过滤器进行处理,目前仅仅只有StandardFilter对Token 的类型是敏感的。

 

 

5.  solr.HTMLStripWhitespaceTokenizerFactory
从结果中除去HTML标签,将结果交给WhitespaceTokenizer处理。
例子:
my <a href="www.foo.bar">link</a>
my link
<?xml?><br>hello<!--comment-->
hello
hello<script><-- f('<--internal--></script>'); --></script>
hello
if a<b then print a;
if a<b then print a;
hello <td height=22 nowrap align="left">
hello
a&lt;b &#65 Alpha&Omega &Omega;
a<b A Alpha&Omega Ω

6.  solr.HTMLStripStandardTokenizerFactory
从结果中出去HTML标签,将结果交给StandardTokenizer处理。

7.  solr.PatternTokenizerFactory
说明:按照规则表达式样式对分本进行分词。
例子:处理对象为,mice; kittens; dogs,他们由分号加上一个或多个的空格分隔。
<fieldType name="semicolonDelimited" class="solr.TextField">
  <analyzer>
     <tokenizer class="solr.PatternTokenizerFactory" pattern="; *" />
  </analyzer>
</fieldType>


Solr有哪些TokenFilterFactories?

1.  solr.StandardFilterFactory
创建:org.apache.lucene.analysis.standard.StandardFilter.
移除首字母简写中的点和Token后面的’s。仅仅作用于有类的Token,他们是由StandardTokenizer产生的。
例:StandardTokenizer+ StandardFilter
"I.B.M. cat's can't" ==> "IBM", "cat", "can't"
2.  solr.LowerCaseFilterFactory
创建:org.apache.lucene.analysis.LowerCaseFilter.
3.  solr.TrimFilterFactory【solr1.2】
创建:org.apache.solr.analysis.TrimFilter
去掉Token两端的空白符
例:
" Kittens!   ", "Duck" ==> "Kittens!", "Duck".
4.  solr.StopFilterFactory
创建:org.apache.lucene.analysis.StopFilter
去掉如下的通用词,多为虚词。
   "a", "an", "and", "are", "as", "at", "be", "but", "by",
    "for", "if", "in", "into", "is", "it",
    "no", "not", "of", "on", "or", "s", "such",
    "t", "that", "the", "their", "then", "there", "these",
    "they", "this", "to", "was", "will", "with"
自定义的通用词表的使用可以通过schema.xml文件中的"words"属性来指定,如下。
<fieldtype name="teststop" class="solr.TextField">
   <analyzer>
     <tokenizer class="solr.LowerCaseTokenizerFactory"/>
     <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
   </analyzer>
</fieldtype>

5.   solr.KeepWordFilterFactory【solr1.3】
创建:org.apache.solr.analysis.KeepWordFilter
作用与solr.StopFilterFactory相反,保留词的列表也可以通过”word”属性进行指定。
<fieldtype name="testkeep" class="solr.TextField">
   <analyzer>
     <filter class="solr.KeepWordFilterFactory" words="keepwords.txt" ignoreCase="true"/>
   </analyzer>
</fieldtype>

6. solr.LengthFilterFactory
创建:solr.LengthFilter
过滤掉长度在某个范围之外的词。范围设定方式见下面。
<fieldtype name="lengthfilt" class="solr.TextField">
  <analyzer>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LengthFilterFactory" min="2" max="5" />
  </analyzer>
</fieldtype>
7.  solr.PorterStemFilterFactory
创建:org.apache.lucene.analysis.PorterStemFilter
采用Porter Stemming Algorithm算法去掉单词的后缀,例如将复数形式变成单数形式,第三人称动词变成第一人称,现在分词变成一般现在时的动词。
8.  solr.EnglishPorterFilterFactory
创建:solr.EnglishPorterFilter
关于句子主干的处理,其中的"protected"指定不允许修改的词的文件。
9.  solr.SnowballPorterFilterFactory
关于不同语言的词干处理
10.solr.WordDelimiterFilterFactory
关于分隔符的处理。
11.solr.SynonymFilterFactory
关于同义词的处理。
12.solr.RemoveDuplicatesTokenFilterFactory
避免重复处理。

 

原文: http://damoqingquan.iteye.com/blog/231225

参考:http://lionelf.iteye.com/blog/1171508

 

分享到:
评论

相关推荐

    ik-analyzer-solr7.zip

    解压"ik-analyzer-solr7.zip"后,你会得到ik-analyzer-solr7.x目录,这个目录包含了IKAnalyzer在Solr中的所有相关组件。通常,这些组件包括配置文件、分词器的JAR库以及可能的字典文件。配置文件(如`schema.xml`或`...

    ikanalyzer-solr8.4.0_solr8_solr_ikanalyzer_中文分词_

    在 Solr 环境中,ikanalyzer 的作用是为中文文档提供精确的分词服务,从而提升搜索质量和效率。Solr8.4.0 是 Apache Solr 的一个版本,这是一个高度可配置、高性能的全文搜索和分析引擎,广泛用于构建企业级搜索应用...

    solr+IK Analyzer

    Solr和IK Analyzer是两个在中文分词和全文检索领域常用的工具。Solr是一个开源的搜索服务器,由Apache Lucene项目提供支持,它允许开发者构建和维护高度可扩展的、高性能的搜索应用。而IK Analyzer是一款针对中文的...

    IKAnalyzer-5.0.jar及solr-analyzer-extra-5.3.jar

    标题中的"IKAnalyzer-5.0.jar"和"solr-analyzer-extra-5.3.jar"是两个在中文搜索引擎系统Solr中常见的组件,主要用于处理中文分词问题。这两个组件在构建高性能的中文搜索解决方案中扮演着至关重要的角色。 首先,...

    ikanalyzer-solr5

    ikanalyzer-solr5 是一个专门为 Solr 5 及以上版本设计的中文分词器插件。在信息检索和自然语言处理领域,分词器是至关重要的工具,它负责将连续的文本切割成有意义的词语,以进行索引和查询操作。ikanalyzer 是一个...

    ikanalyzer-solr.zip

    《ikanalyzer-solr:Solr的中文分词利器》 在信息检索和文本分析领域,中文分词是至关重要的一步,它能够将连续的汉字序列切分成具有语义的词汇单元,为后续的文本处理提供基础。ikanalyzer-solr正是一款专为Apache...

    ikanalyzer-solr5.zip

    ikanalyzer-solr5.zip是一个专门针对中文分词的工具包,主要服务于Solr5版本。这个压缩包包含了两个核心的Java档案文件(jar包):ik-analyzer-solr5-5.x.jar和solr-analyzer-ik-5.1.0.jar,它们在信息技术领域,...

    ikanalyzer-solr

    《IK Analyzer与Solr 7.2.1的整合及中文分词实践》 IK Analyzer是一款优秀的开源中文分词器,特别适用于Java环境下。在信息检索、文本挖掘等领域,中文分词是至关重要的一步,因为它直接影响到后续的文本处理效果。...

    solr分词器资源 solr-ikanalyzer 资源包

    solr-ik分词器的资源包,包括:ext.dic;ikanalyzer.cfg.xml;ik-analyzer-solr5-5.x.jar;solr-analyzer-ik-5.1.0.jar;stopword.dic 五个文件

    solr中文分词jar包ik-analyzer 含class配置 ik-analyzer-7.5.0

    标题提到的"ik-analyzer 7.5.0"是Ik Analyzer的一个特定版本,这个版本包含了对Solr的支持,并且提供了类(class)配置,使得用户可以方便地集成到Solr环境中。Ik Analyzer的发展历程中,不断优化了分词效果,提高了...

    IKAnalyzer-5.0.jar+solr-analyzer-extra-5.3.jar

    本篇将详细介绍IKAnalyzer-5.0.jar和solr-analyzer-extra-5.3.jar这两个Solr的IK分词器组件及其功能。 首先,IKAnalyzer-5.0.jar是IK分词器的主要核心库,由开源社区维护和更新。这个版本的IKAnalyzer支持词典动态...

    ik-analyzer-solr-6.x.jar

    solr更新到6.x的版本了,ik-analyzer-5.x.jar又不好使了。 无意间从"随-忆"的博客中看到了如何去修改源代码,从而让分词器能够适应6.x的版本,亲自尝试了一下,果然可以,于是奉上了自己重新编译的jar包。 6.x的版本...

    ikanalyzer-solr5.rar

    《Solr中文分词器IKAnalyzer的深度解析与应用》 在信息爆炸的时代,搜索引擎已经成为了数据检索的重要工具。在Java领域,Apache Solr作为一款强大的开源搜索平台,以其高效、可扩展性著称。然而,面对中文这种复杂...

    IKAnalyzer 支持Solr-5.5.0

    标题中的"IKAnalyzer 支持Solr-5.5.0"表明了这个压缩包是为集成IK Analyzer到Apache Solr 5.5.0版本而准备的。IK Analyzer是一款针对中文分词的开源工具,它在处理中文文本时表现优秀,能够提高搜索引擎的检索效果。...

    分词器 ikanalyzer-solr6.5

    ikanalyzer-solr6.5 是一个专门为Solr 6.5版本设计的中文分词器,它基于ikanalyzer,并且进行了优化以更好地适应Solr的索引和搜索需求。ikanalyzer是一个开源的、基于Java实现的中文分词库,主要用于解决中文文本...

    ik-analyzer-solr7-7.x.zip

    标题“ik-analyzer-solr7-7.x.zip”表明这是一个与Solr7相关的压缩包,其中包含了IK Analyzer,一个广泛使用的中文分词工具。这个压缩包特别为Solr7版本进行了优化,提供了完整的配置文件,使得用户可以方便地集成到...

    ikanalyzer-solr中文分词包兼容solr7.5

    ikanalyzer-solr中文分词包是专门为Apache Solr设计的一款强大的中文分词工具,它在处理中文文本时能够有效地进行词语切分,提高搜索准确性和效率。标题中提到的"ikanalyzer-solr中文分词包兼容solr7.5"意味着这个...

    solr-7.7.2+ik-analyzer-solr7x.zip

    "solr-7.7.2+ik-analyzer-solr7x.zip"这个压缩包文件包含了Solr 7.7.2版本与Ik Analyzer的集成,特别针对Solr 7.x系列进行了优化。 Solr 7.7.2版本是Solr的一个稳定发行版,它提供了以下关键特性: 1. **高性能...

Global site tag (gtag.js) - Google Analytics