当前位置 : 主页 > 网络推广 > seo >

搜索引擎系列九:solr索引详解(Schema介绍、字段定义详解)

来源:互联网 收集:自由互联 发布时间:2021-06-16
一、Schema介绍 1. Schema 是什么? Schema:模式,是集合/内核中字段的定义,让solr知道集合/内核包含哪些字段、字段的数据类型、字段该索引存储。 2.Schema 的定义方式 Solr中提供了两种方

一、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控制台就可以进行测试查看效果了

 

网友评论