SOLR企业搜索平台 三 (schema.xml配置+IK Analyzer分词)

文章转自:http://3961409.blog.51cto.com/3951409/836027

 

我们首先来说说这个schema.xml。 
schema.xml,这个相当于数据表配置文件,它定义了加入索引的数据的数据类型。主要包括types、fields和其他的一些缺省设置。 

1)首先需要在types结点内定义一个FieldType子结点,包括name,class,positionIncrementGap等等一些参数,name就是这个FieldType的名称,class指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为。在FieldType定义的时候最重要的就是定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer,包括分词和过滤。在第二篇文章中详细讲了怎样添加中文分词器,详情请参见http://3961409.blog.51cto.com/3951409/833417

2)接下来的工作就是在fields结点内定义具体的字段(类似数据库中的字段),就是filed,filed定义包括name,type(为之前定义过的各种FieldType),indexed(是否被索引),stored(是否被储存),multiValued(是否有多个值)等等。 
例: 

  1. <field name="id" type="string" indexed="true" stored="true" required="true" />  
  2. <field name="ant_title" type="textComplex" indexed="true" stored="true" />  
  3. <field name="ant_content" type="textComplex" indexed="true" stored="true" /> 
  4. <field name="all" type="textComplex" indexed="true" stored="false" multiValued="true"/> 

field的定义相当重要,有几个技巧需注意一下,对可能存在多值得字段尽量设置multiValued属性为true,避免建索引抛出错误;如果不需要存储相应字段值,尽量将stored属性设为false。

3)建议建立了一个拷贝字段,将所有的全文字段复制到一个字段中,以便进行统一的检索: (此时进行查询使用all:jason就相当于使用ant_title:jason or ant_content:jason)

  1. <field name="all" type="textComplex" indexed="true" stored="false" multiValued="true"/>  

并在拷贝字段结点处完成拷贝设置: 

  1. <copyField source="ant_title" dest="all"/> 
  2. <copyField source="ant_content" dest="all"/> 

4)除此之外,还可以定义动态字段,所谓动态字段就是不用指定具体的名称,只要定义字段名称的规则,例如定义一个dynamicField,name 为*_i,定义它的type为text,那么在使用这个字段的时候,任何以_i结尾的字段都被认为是符合这个定义的,例如:name_i,gender_i,school_i等。

schema.xml配置文件大体上就是这样,更多细节请参见solr wiki http://wiki.apache.org/solr/SchemaXml

 

 

转自:http://www.cnblogs.com/wrt2010/archive/2012/11/14/2769521.html

 

附:ik-analyzer google code 地址:https://code.google.com/p/ik-analyzer/downloads/list

 

下面就来看一下中文分词吧,这里用的分词是IK Analyzer 2012。

中文分词

复制代码
 1 <!-- IKAnalyzer2012 -->
 2 <fieldType name="text_ika" class="solr.TextField">
 3     <analyzer type="index" positionIncrementGap="100" autoGeneratePhraseQueries="true">
 4         <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>
 5         <!-- <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> -->
 6         <!-- <filter class="solr.LowerCaseFilterFactory"/> -->
 7     </analyzer>
 8     <analyzer type="query">
 9         <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true" />
10         <!-- <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> -->
11         <!-- <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> -->
12         <!-- <filter class="solr.LowerCaseFilterFactory"/> -->
13     </analyzer>
14 </fieldType>
复制代码

分词用的依旧是fieldType,为的是在下面的field中能够用到。

有两个analyzer,一个是index,一个是query,index是针对于所有,query是针对于搜索。

可以看到我注掉了两个filter,为什么呢。

先说简单的吧,一个是query中的同义词Filter,solr.SynonymFilterFactory,注掉他是因为当前没有一个庞大的词库能够支撑中文如此复杂的同义词量。

另外一个是忽略大小写的Filter,这个Filter可以根据自己的需要进行添加或删除,在我们的系统中,主要处理中文,这个用处也不大。

还有一个注掉的Filter是停词Filter,这个用处挺大的,为什么注掉呢?因为我感觉他在这里不太合适。

解释一下:停词组件在中文分词中很重要,IK也提供了相对应的配置方法,不仅仅可以处理停词,而且还可以自定义词库。所以,我建议将停词在IK中配置而不是在schema.xml中。

两种方法都说一下:

第一种:在schema.xml中配置,不要注释stopword组件,并将停词文件拷贝至solrHome/core/conf目录下(注意文件的编码方式,至少保证文本文件是UTF-8格式,更加严格的,保证文本文件是无BOM格式的UTF-8编码)。

第二种:在IK配置文件中配置,请下载一个IK分词组件,里面会有一个IKAnalyzer.cfg.xml的配置文件,拷贝到solr项目的源代码根目录下,并将stopword.dic也拷贝到根目录下,如下图所示:

记得要导入IK的Jar包,这样,在你的文件中就可以使用IK提供的中文分词了。

 给一个我用的stopword.dic,去下载

IK也可以自定义词库,这个可以看一下IK的文档,很简单,将你的自定义词库的文件拷贝至根目录,并在IK配置文件中配置即可。

 

(注意IK Solr4.0配置

这里特别的罗嗦几句,在Solr4.0发布以后,官方取消了BaseTokenizerFactory接口,而直接使用Lucene Analyzer标准接口。因此IK分词器2012 FF版本也取消了org.wltea.analyzer.solr.IKTokenizerFactory类。

4.1 solr4.0配置样例

 

使用IKAnalyzer的配置

 <fieldType name="text" class="solr.TextField">

     <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

</fieldType>

 

 

 

 

 

 

 

 

猜你喜欢

转载自yangjayup.iteye.com/blog/1989732