`
haiziwoainixx
  • 浏览: 409602 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SOLR使用手册之配置schema

 
阅读更多
一.Schema API 

参考:https://cwiki.apache.org/confluence/display/solr/Schema+API

solr本身提供了以下接口来操作schema,因为不是特别适用,不再一一介绍,实际场景中我们可能更多的使用直接修改schema.xml的方式.

二.Schema.xml 配置

4.9版本的solr中,schema.xml主要包含以下节点

<schema>
  <field>
  <dynamicField>  
  <uniqueKey>
  <copyField>
  <fieldType >
</schema>
    

下面分别介绍一下:

1.field 普通字段
    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />  
  • name:标识而已。
  • type:先前定义的类型。
  • indexed:是否被用来建立索引(关系到搜索和排序)
  • stored:是否储存
  • compressed:[false],是否使用gzip压缩(只有TextField和StrField可以压缩)
  • mutiValued:是否包含多个值
  • omitNorms:字段的长度不影响得分和在索引时不做boost时,设置它为true。一般文本字段不设置为true。
  • termVectors:[false],当设置true,会存储 term vector。当使用MoreLikeThis,用来作为相似词的field应该存储起来。
  • termPositions:存储 term vector中的地址信息,会消耗存储开销。如果字段被用来做more like this 和highlight的特性时应设置为true。 
  • termOffsets:存储 term vector 的偏移量,会消耗存储开销。
  • default:如果没有属性需要修改,就可以用这个标识下。
2.dynamicField 动态字段
    通过通配符来对字段进行匹配
  <dynamicField name="*_i" type="int" indexed="true" stored="true"/> 
  <dynamicField name="*_is" type="int" indexed="true" stored="true" multiValued="true"/>
     
  • "*"只能出现在模式的最前和最后
  • 较长的模式会被先去做匹配
  • 如果2个模式同时匹配上,最先定义的优先
  • 3.uniqueKey 唯一标示,通常为主键
    <uniqueKey>id</uniqueKey>
 

4.copyField 拷贝字段    

    将要用于查询的字段同时复制到一个字段中,查询时只需查询这单个字段,可以提到搜索索引效率
   <copyField source="cat" dest="text"/> 
  <copyField source="name" dest="text"/>
 
5.fieldType 字段类型
    <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>    
  • name:    字段类型名  
  • class:    java类名  
  • indexed:    缺省true。 说明这个数据应被搜索和排序,如果数据没有indexed,则stored应是true。  
  • stored:    缺省true。说明这个字段被包含在搜索结果中是合适的。如果数据没有stored,则indexed应是true。  
  • sortMissingLast:    指没有该指定字段数据的document排在有该指定字段数据的document的后面  
  • sortMissingFirst:    指没有该指定字段数据的document排在有该指定字段数据的document的前面  
  • omitNorms:    字段的长度不影响得分和在索引时不做boost时,设置它为true。一般文本字段不设置为true。  
  • termVectors:    如果字段被用来做more like this 和highlight的特性时应设置为true。  
  • compressed:    字段是压缩的。这可能导致索引和搜索变慢,但会减少存储空间,只有StrField和TextField是可以压缩,这通常适合字段的长度超过200个字符。  
  • multiValued:    字段多于一个值的时候,可设置为true。  
  • positionIncrementGap:   可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误。 和multiValued一起使用,设置多个值之间的虚拟空白的数量 
 
三.分词器配置
 
1.概念:
analyzer 分析器
tokenizer 分词器,是把一个文本流切成一个个token的 
filter 过滤器,是专门处理一个个token的
solr的分词是配置在fieldType下的,有两种方式来进行配置
方式一,直接由org.apache.lucene.analysis.Analyzer的子类进行设定,这个分析器直接包含了一系列的分词器和过滤器

方式二,一个fieldType可以配置两个分析器,每个分析器包含一个分词器和多个过滤器,如下:

 
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <!-- in this example, we will only use synonyms at query time <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> -->
        <filter class="solr.LowerCaseFilterFactory"/> </analyzer> 
    <analyzer type="query"> 
        <tokenizer class="solr.StandardTokenizerFactory"/> 
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType>
 
 
2.solr都有哪些分词器(以下摘自http://damoqingquan.iteye.com/blog/231293)
 
(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>

 
 

 

 3.Solr有哪些过滤器
 
(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",

    自定义的通用词表的使用可以通过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

说明:避免重复处理。

    
 
4.中文分词器--IK分词器
    (1)下载地址:https://code.google.com/p/ik-analyzer/downloads/list 下载IK Analyzer 2012FF_hf1版本
    (2)解压缩IK Analyzer 2012FF_hf1.zip 把IKAnalyzer2012FF_u1.jar拷贝到你应用服务器下的/WEB-INF/lib中
    (3)拷贝IKAnalyzer.cfg.xml和stopword.dic 到/WEB-INF/classes下
    (4)分词器配置如下:
             <!-- ik分词器 -->
  <fieldType name="text_ik" class="solr.TextField">
      <analyzer  class="org.wltea.analyzer.lucene.IKAnalyzer"/>
  </fieldType>   
 
    注意:不能在这里加positionIncrementGap="100" 属性,否则solr无法启动
               另外在IKAnalyzer.cfg.xml配置的ext_dict和ext_stopwords一定要是UTF8编码,否则无法生效,
               下载包的不是UTF8编码,需要自己用编辑器转换一下  
        

5.中文义分词器--mmseg4j

    (1)下载地址:https://code.google.com/p/mmseg4j/downloads/list
    (2)解压mmseg4j-1.9.1.zip,把dist下面的所有jar文件拷贝到你应用服务器下的/WEB-INF/lib中
    (3)拷贝mmseg4j-1.9.1/mmseg4j-core/src/test/resources/data到任意目录中
    (4)分词器配置如下:
<!-- mmseg4j分词器 -->
 <fieldType name="text_mmseg4j" class="solr.TextField" >
 <analyzer type="index">
<!--此处为分词器词典所处位置-->
 <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="../dic" />
 </analyzer>
 <analyzer type="query">
<!--1.9.1也可以直接这样写 字典在jar包里-->
 <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="dic" />
 </analyzer>
 </fieldType>
 
mmseg4j有三种分词模式complex simple 和 max-word,关于mmseg4j的词库介绍:
  • data/chars.dic 是单字与语料中的频率,一般不用改动,1.5版本中已经加到mmseg4j的jar里了,我们不需要关心它,当然你在词库目录放这个文件可以覆盖它。
  • data/units.dic 是单字的单位,默认读jar包里的,你也可以自定义覆盖它,这个功能是试行,如果不喜欢它,可以用空的units.dic文件(放到你的词库目录下)覆盖它。
  • data/words.dic 是词库文件,一行一词,当然你也可以使用自己的,1.5版本使用 sogou 词库,1.0的版本是用 rmmseg 自带的词库。
  • data/wordsxxx.dic 1.6版支持多个词库文件,data 目录(或你定义的目录)下读到"words"前缀且".dic"为后缀的文件。如:data/words-my.dic。
  • 由于 utf-8 文件有带与不带 BOM 之分,建议词库第一行为空行或为无 BOM 格式的 utf-8 文件。

     注意:mmseg4j最新版本1.9.1只能支持solr4.7以前,不支持最新solr,并且在4.7版本中直接使用会报错,如下:  

 reset()/close() call missing, reset() called multiple times, or subclass does not call super.reset(). 
     解决方案:
        将mmseg4j-analysis源码导入新建工程(依赖jar包:lucene-core-4.7.2.jar,mmseg4j-core-1.9.1.jar,mmseg4j-solr-1.9.1.jar),
        找到com.chenlb.mmseg4j.analysis.MMSegTokenizer 在reset()方法中加入一行:
        super.reset();
        重新编译打好jar包即可解决.
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics