一、Schema介绍
1. Schema 是什么?
Schema:模式,是集合/内核中字段的定义,让solr知道集合/内核包含哪些字段、字段的数据类型、字段该索引存储。
2. Schema 的定义方式
Solr中提供了两种方式来配置schema,两者只能选其一
2.1 默认方式,通过Schema API 来实时配置,模式信息存储在内核目录的conf/managed-schema文件中。
2.2 传统的手工编辑conf/schema.xml的方式,编辑完后需重载集合/内核才会生效。
3. schema两种配置方式切换
3.1 schema.xml 到 managed schema
只需将 solrconfig.xml中的<schemaFactory class =“ClassicIndexSchemaFactory”/> 去掉,或改为ManagedIndexSchemaFactory
Solr重启时,它发现存储schema.xml 但不存储在 managed-schema,它会备份schema.xml,然后改写schema.xml 为 managed-schema。此后就可以通过Schema API 管理schema了。
3.2 managed schema 到 schema.xml
1 将managed-schema 重命名为 schema.xml
2 将solrconfig.xml 中schemaFactory 的ManagedIndexSchemaFactory去掉(如果存在)
3 增加<schemaFactory class =“ClassicIndexSchemaFactory”/>
4. 查看 D:\solr-7.3.0\server\solr\mycore\conf\managed-schema文件,了解它的构成
二、字段定义详解
1. 字段定义示例
<field name="name" type="text_general" indexed="true" stored="true"/> <field name="includes" type="text_general" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />
字段属性说明
name:字段名,必需。字段名可以由字母、数字、下划线构成,不能以数字开头。以下划线开头和结尾的名字为保留字段名,如 _version_
type:字段的fieldType名,必需。为 FieldType定义的name 属性值。
default:默认值,如果提交的文档中没有该字段的值,则自动会为文档添加这个默认值。非必需。
2. 字段定义详解-FieldType
字段类型,定义在索引时该如何分词、索引、存储字段,在查询时该如何对查询串分词
<fieldType name="managed_en" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.ManagedStopFilterFactory" managed="english" /> <filter class="solr.ManagedSynonymGraphFilterFactory" managed="english" /> <filter class="solr.FlattenGraphFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.ManagedStopFilterFactory" managed="english" /> <filter class="solr.ManagedSynonymGraphFilterFactory" managed="english" /> </analyzer> </fieldType>
FieldType 的属性
Solr中提供的 FieldType 类,在 org.apache.solr.schema 包下
http://lucene.apache.org/solr/guide/7_3/field-types-included-with-solr.html
3. FieldType 的 Analyzer
对于 solr.TextField or solr.SortableTextField 字段类型,需要为其定义分析器。
<fieldType name="nametext" class="solr.TextField"> <analyzer class="org.apache.lucene.analysis.core.WhitespaceAnalyzer"/> </fieldType>
可以直接通过class属性指定分析器类,必须继承org.apache.lucene.analysis.Analyzer 。
也可灵活地组合分词器、过滤器:
<fieldType name="nametext" class="solr.TextField"> <analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StandardFilterFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.StopFilterFactory"/> </analyzer> </fieldType>
注意:org.apache.solr.analysis 包下的类可以简写为 solr.xxx
如果该类型字段索引、查询时需要使用不同的分析器,则需区分配置analyzer
<fieldType name="nametext" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/> <filter class="solr.SynonymFilterFactory" synonyms="syns.txt"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
Solr中提供的tokenizer: http://lucene.apache.org/solr/guide/7_3/tokenizers.html
Solr中提供的 fiter: http://lucene.apache.org/solr/guide/7_3/filter-descriptions.html
4. 常用的Filter
4.1 Stop Filter 停用词过滤器
<analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="stopwords.txt"/> </analyzer>
words属性指定停用词文件的绝对路径或相对 conf/目录的相对路径
停用词定义语法:一行一个
4.2 Synonym Graph Filter 同义词过滤器
<analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.SynonymGraphFilterFactory" synonyms="mysynonyms.txt"/> <filter class="solr.FlattenGraphFilterFactory"/> <!-- required on index analyzers after graph filters --> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.SynonymGraphFilterFactory" synonyms="mysynonyms.txt"/> </analyzer>
同义词定义语法:
一类一行:
couch,sofa,divan
=>表示标准化为后面的:
teh => the
huge,ginormous,humungous => large
small => tiny,teeny,weeny
练习1:自定义字段过滤停用词和同义词
步骤1:
在D:\solr-7.3.0\server\solr\mycore\conf目录下的停用词stopwords.txt和同义词synonyms.txt的txt文件里面分别加入
停用词:
hello
like
同义词:
couch,sofa,divan
teh => the
huge,ginormous,humungous => large
small => tiny,teeny,weeny
步骤2:
在D:\solr-7.3.0\server\solr\mycore\conf目录下的模式文件managed-schema里面自定义一个字段来进行分词索引并配置停用词和同义词
<!--自定义字段过滤停用词和同义词 begin--> <fieldType name="myTestField" class="solr.SortableTextField" positionIncrementGap="100" multiValued="true"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> <!--自定义字段过滤停用词和同义词 end-->
步骤3:
重启solr,在web控制台就可以进行测试查看效果了
练习2:在solr里面集成IKAnalyzer 中文分词器
步骤1:
在原来学习lucene集成IKAnalyzer的基础上,为IkAnalyzer实现一个TokenizerFactory(继承它),接收useSmart参数。
步骤2:
将这三个类打成jar,如 IKAnalyzer-lucene7.3.jar
步骤3:
将这个IKAnalyzer-lucene7.3.jar和 IKAnalyzer的jar 拷贝到web应用的lib目录下
步骤4:
将停用词和扩展词的三个配置文件拷贝到应用的classes目录下
步骤5:
在schema中定义一个FieldType,使用IKAnalyzer适配类
<!--集成IK中文分词器 里面有停用词和扩展词 begin--> <fieldType name="ik_zh_CN" class="solr.TextField"> <analyzer> <tokenizer class="com.study.lucene.demo.analizer.ik.IKTokenizer4Lucene7Factory" useSmart="true" /> </analyzer> </fieldType> <!--集成IK中文分词器 里面有停用词和扩展词 end-->
步骤6.:
重启solr,在web控制台就可以进行测试查看效果了