搜索引擎(Solr-模式详解)

本文详细介绍了Solr中Schema的概念及作用,包括字段定义、字段类型、分析器配置等内容,探讨了Schema的两种配置方式及其切换方法,适合Solr初学者及进阶者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Schema介绍

Schema 是什么?

问题1:在lucene中我们要对文档字段进行索引存储,需要如何做?

问题2:现在我们使用Solr搜索服务平台了,不需要编码了,还需要定义如何索引存储字段吗?

需要一种机制来定义、存储这些字段的索引信息,让solr运行时知道各个内核/集合的字段定义信息,这就是schema。

Schema:模式,是集合/内核中字段的定义,让solr知道集合/内核包含哪些字段、字段的数据类型、字段该索引存储。

Schema 的定义方式

Solr中提供了两种方式来配置schema,两者只能选其一

1.默认方式,通过Schema API 来实时配置,模式信息存储在 内核目录的conf/managed-schema文件中。
2.传统的手工编辑conf/schema.xml的方式,编辑完后需重载集合/内核才会生效。

Schema两种配置方式切换

3682edd0d46534268c3bac65029c2204782.jpg

schema.xml 到 managed schema

只需将 solrconfig.xml中的<schemaFactory class =“ClassicIndexSchemaFactory”/>  去掉,或改为ManagedIndexSchemaFactory Solr重启时,它发现存储schema.xml 但不存储在 managed-schema,它会备份schema.xml,然后改写schema.xml 为 managed-schema。此后就可以通过Schema API 管理schema了。

managed schema 到 schema.xml

将managed-schema 重命名为 schema.xml
将solrconfig.xml 中schemaFactory  的ManagedIndexSchemaFactory去掉(如果存在)
增加<schemaFactory class =“ClassicIndexSchemaFactory”/> 

Schemaless mode

Solr还支持无模式方式,solr会猜测该如何索引字段,不可用在生成环境下。

查看 managed-schema文件,了解它的构成

<?xml version="1.0" encoding="UTF-8" ?>
<schema version="1.6">
	<field .../>  
	<dynamicField .../>
	<uniqueKey>id</uniqueKey>
	<copyField .../>
	<fieldType ...>
		<analyzer type="index">
			<tokenizer .../>
			<filter ... />
		</analyzer>
		<analyzer type="query">
			<tokenizer.../>
			<filter ... />
		</analyzer>
	</fieldType>
</schema>

字段定义详解

字段定义示例

<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" />

好熟悉的感觉!
问1:lucene中字段包含哪几个属性?
疑惑:这里的type和lucene中字段的type是一回事吗?

字段属性说明

name:字段名,必需。字段名可以由字母、数字、下划线构成,不能以数字开头。以下划线开头和结尾的名字为保留字段名,如 _version_

type:字段的fieldType名,必需。为 FieldType定义的name 属性值。

default:默认值,如果提交的文档中没有该字段的值,则自动会为文档添加这个默认值。非必需。

字段中用于覆盖fieldType的可选属性说明

e3cfaee7d29c41ce81feac632613b3a10a8.jpg

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 的属性

c2435c20f1c3e931354db415d0c9d2f45a9.jpg

Solr中提供的 FieldType 类,在 org.apache.solr.schema 包下

http://lucene.apache.org/solr/guide/7_3/field-types-included-with-solr.html

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

常用的Filter

Stop Filter   停用词过滤器

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.StopFilterFactory" words="stopwords.txt"/>
</analyzer>

words属性指定停用词文件的绝对路径或相对 conf/目录的相对路径

停用词定义语法:一行一个

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

一类一行, =>表示标准化为后面的

Filter 练习1

1、往停用词文件中添加
    hello
    like
2、往同义词文件中添加

couch,sofa,divan
teh => the
huge,ginormous,humungous => large
small => tiny,teeny,weeny

3、用下面的短语在web管理控制台进行测试
      停用词测试:      Hello world, do you like apple
      同义词测试: teh small couch

集成IKAnalyzer 中文分词器

1、在原来学习lucene集成IKAnalyzer的基础上,为IkAnalyzer实现一个TokenizerFactory(继承它),接收useSmart参数。

2、将这三个类打成jar,如  IKAnalyzer-lucene7.3.jar

3、将这个jar和 IKAnalyzer的jar 拷贝到web应用的lib目录下

4、将三个配置文件拷贝到应用的classes目录下

5、在schema中定义一个FieldType,使用IKAnalyzer适配类

<fieldType name=“zh_CN _text" class="solr.TextField">
    <analyzer>
        <tokenizer class="com.dongnao.lucene.demo.analizer.ik.IKTokenizer4Lucene7Factory" useSmart="true" /> 
    </analyzer>
</fieldType>

FieldType 练习2

1、定义一个FieldType,索引的分词器用IKAnalyzer,查询的分词器用IKAnaylzer + 同义词Filter。
2、配置同义词:

相同,相似,相近
电脑,笔记本电脑=>计算机

3、测试分词:
      他的电脑和她的笔记本电脑很相似

CopyField    复制字段

复制字段允许将一个或多个字段的值填充到一个字段中。它的用途有两种:
1、将多个字段内容填充到一个字段,来进行搜索
2、对同一个字段内容进行不同的分词过滤,创建一个新的可搜索字段
定义方式:
1、先定义一个普通字段

<field name="cc_all" type="zh_CN_text" indexed="true" stored="false" multiValued="false" />

2、定义复制字段

<copyField source="cat" dest="cc_all"/>
<copyField source="name" dest="cc_all"/>

 

转载于:https://my.oschina.net/u/3728166/blog/3010698

Apache Solr 是一个开源的搜索服务器,Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。定制 Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一 个描述所有 Field 及其内容的 XML 文档就可以了。定制搜索的时候只需要发送 HTTP GET 请求 即可,然后对 Solr 返回的信息进行重新布局,以产生利于用户理解的页面内容布局。Solr 1.3 版 本开始支持从数据库(通过 JDBC)、 RSS 提要、 Web 页面和文件中导入数据,但是不直接支持从 二进制文件格式中提取内容,比如 MS Office、Adobe PDF 或其他专有格式。 更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。 通过对 Solr 进行适当的配置, 某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此 外,很多 Lucene 工具(如 Nutch、 Luke)也可以使用 Solr 创建的索引 Solr 的特性包括:  高级的全文搜索功能  专为高通量的网络流量进行的优化  基于开放接口(XML 和 HTTP)的标准  综合的 HTML 管理界面  可伸缩性-能够有效地复制到另外一个 Solr 搜索服务器  使用 XML 配置达到灵活性和适配性  可扩展的插件体系 1.2.1 Solr使用Lucene并且进行了扩展  一个真正的拥有动态域(Dynamic Field)和唯一键(Unique Key)的数据模式(Data Schema)  对 Lucene 查询语言的强大扩展!  支持对结果进行动态的分组和过滤  高级的,可配置的文本分析  高度可配置和可扩展的缓存机制 5/8/2011 Page 4 5/8/20112009-02-17 版权所有,侵权必究All rights reserved 第4页,共56页Page 4 , Total56  性能优化  支持通过 XML 进行外部配置  拥有一个管理界面  可监控的日志  支持高速增量式更新(Fast incremental Updates)和快照发布(Snapshot Distribution) 1.2.2 Schema(模式)  定义域类型和文档的域  能够驱动智能处理  声明式的 Lucene 分析器规范  动态域能够随时增加域  拷贝域功能允许对一个域进行多种方式的索引,或者将多个域联合成一个可搜索的域  显式类型能够减少对域类型的猜测  能够使用外部的基于文件的终止词列表,同义词列表和保护词列表的配置 1.2.3 查询  拥有可配置响应格式(XML/XSLT,JSON,Python,Ruby)的 HTTP 接口  高亮的上下文搜索结果  基于域值和显式查询的片段式搜索(Faceted Search)  对查询语言增加了排序规范  常量的打分范围(Constant scoring range)和前缀式查询-没有 idf,coord,或者 lengthNorm 因子,对查询匹配的词没有数量限制  函数查询(Function Query)-通过关于一个域的数值或顺序的函数对打分进行影响  性能优化 1.2.4 核心  可插拔的查询句柄(Query Handler)和可扩展的 XML 数据格式  使用唯一键的域能够增强文档唯一性  能够高效地进行批量更新和删除  用户可配置的文档索引变化触发器(命令)  并发控制的搜索器  能够正确处理数字类型,从而能够进行排序和范围搜索  能够控制缺失排序域的文档  支持搜索结果的动态分组 1.2.5 缓存  可配置的查询结果,过滤器,和文档缓存实例  可插拔的缓存实现  后台缓存热启:当一个新的搜索器被打开时,可配置的搜索将它热启,避免第一个结果慢 下来,当热启时,当前搜索器处理目前的请求(???)。  后台自动热启:当前搜索器缓存中最常访问的项目在新的搜索器中再次生成,能够在索引 器和搜索器变化的时候高速缓存常查询的结果 5/8/2011 Page 5 5/8/20112009-02-17 版权所有,侵权必究All rights reserved 第5页,共56页Page 5 , Total56  快速和小的过滤器实现  支持自动热启的用户级别的缓存 1.2.6 复制  能够将使用 rsync 传输时改变的索引部分有效的发布  使用拉策略(Pull Strategy)来简化增加搜索器  可配置的发布间隔能够允许对时间线和缓存使用进行权衡选择 1.2.7 管理接口  能够对缓存使用,更新和查询进行综合统计  文本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值