参考:https://cwiki.apache.org/confluence/display/solr/Schema+API
4.9版本的solr中,schema.xml主要包含以下节点
< dynamicField>
下面分别介绍一下:
- 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个模式同时匹配上,最先定义的优先
- 3.uniqueKey 唯一标示,通常为主键
4.copyField 拷贝字段
- 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一起使用,设置多个值之间的虚拟空白的数量
方式二,一个fieldType可以配置两个分析器,每个分析器包含一个分词器和多个过滤器,如下:
(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<b A Alpha&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>
(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
说明:避免重复处理。
<fieldType name="text_ik" class="solr.TextField"><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/></fieldType>
5.中文义分词器--mmseg4j
(3)拷贝mmseg4j-1.9.1/mmseg4j-core/src/test/resources/data到任意目录中
<!-- 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().