设为首页 收藏本站
查看: 913|回复: 0

[经验分享] SOLR使用手册之配置schema

[复制链接]

尚未签到

发表于 2016-12-16 06:16:18 | 显示全部楼层 |阅读模式
一.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.iyunv.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包即可解决.
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-314768-1-1.html 上篇帖子: 三种solr提交(commit)索引的方式 下篇帖子: Tomcat 7.0 配置 solr 4.7.2 全过程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表