schema.xml的配置

schema.xml做什么?

SOLR加载数据,创建索引和数据时,核心数据结构的配置文件是schema.xml,该配置文件主要用于配置数据源,字段类型定义,搜索类型定义等。schema.xml的配置直接影响搜索结果的准确性与效率。

<types></types>节点

types节点主要用于搜索类型的定义,这里给出常用类型的定义。

<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
<fieldtype name="binary" class="solr.BinaryField"/>
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
<fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
<fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>
<fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>
<fieldType name="pint" class="solr.IntField"/>
<fieldType name="plong" class="solr.LongField"/>
<fieldType name="pfloat" class="solr.FloatField"/>
<fieldType name="pdouble" class="solr.DoubleField"/>
<fieldType name="pdate" class="solr.DateField" sortMissingLast="true"/>
<fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="random" class="solr.RandomSortField" indexed="true" />

这里给出的类型有,字符串,bool,int,date等等,基本java常用的都有。下面解释一下各个参数的意思。

name:定义搜索字段名

class:这个搜索字段实际使用的类与方法。在org.appache.solr.analysis包下,包括了常用的类型。

其他可选的属性:

sortMissingLast,sortMissingFirst两个属性是用在可以内在使用String排序的类型上,默认false,适用于字段类型:string,boolean,sint,slong,sfloat,sdouble,pdate。

sortMissingLast="true",没有该field的数据排在有该field的数据之后,而不管请求时的排序规则,在Java中对应的意思就是,该字段为NULL,排在后面。

sortMissingFirst="true",排序规则与sortMissingLast相反。

positionIncrementGap:可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误。

在配置中,string类型的class是solr.StrField,而这个字段是不会被分析存储的,也就是说不会被分词。

而对于文章或者长文本来说,我们必须对其进行分词才能保证搜索某些字段时能够给出正确的结果。这时我们就可以用到另外一个class,solr.TextField。它允许用户通过分析器来定制索引和查询,分析器包括一个分词器(tokenizer)和多个过滤器(filter) 。

下面就来看一下中文分词吧,这里用的分词是IK Analyzer 2012。

中文分词

<!-- IKAnalyzer2012 -->
<fieldType name="text_ika" class="solr.TextField">
    <analyzer type="index" positionIncrementGap="100" autoGeneratePhraseQueries="true">
        <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>
        <!-- <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> -->
        <!-- <filter class="solr.LowerCaseFilterFactory"/> -->
    </analyzer>
    <analyzer type="query">
        <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true" />
        <!-- <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> -->
        <!-- <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> -->
        <!-- <filter class="solr.LowerCaseFilterFactory"/> -->
    </analyzer>
</fieldType>

分词用的依旧是fieldType,为的是在下面的field中能够用到。

有两个analyzer,一个是index,一个是query,index是针对于所有,query是针对于搜索。

可以看到我注掉了两个filter,为什么呢。

先说简单的吧,一个是query中的同义词Filter,solr.SynonymFilterFactory,注掉他是因为当前没有一个庞大的词库能够支撑中文如此复杂的同义词量。

另外一个是忽略大小写的Filter,这个Filter可以根据自己的需要进行添加或删除,在我们的系统中,主要处理中文,这个用处也不大。

还有一个注掉的Filter是停词Filter,这个用处挺大的,为什么注掉呢?因为我感觉他在这里不太合适。

解释一下:停词组件在中文分词中很重要,IK也提供了相对应的配置方法,不仅仅可以处理停词,而且还可以自定义词库。所以,我建议将停词在IK中配置而不是在schema.xml中。

两种方法都说一下:

第一种:在schema.xml中配置,不要注释stopword组件,并将停词文件拷贝至solrHome/core/conf目录下(注意文件的编码方式,至少保证文本文件是UTF-8格式,更加严格的,保证文本文件是无BOM格式的UTF-8编码)。

第二种:在IK配置文件中配置,请下载一个IK分词组件,里面会有一个IKAnalyzer.cfg.xml的配置文件,拷贝到solr项目的源代码根目录下,并将stopword.dic也拷贝到根目录下,如下图所示:

记得要导入IK的Jar包,这样,在你的文件中就可以使用IK提供的中文分词了。

IK也可以自定义词库,这个可以看一下IK的文档,很简单,将你的自定义词库的文件拷贝至根目录,并在IK配置文件中配置即可。

<fields></fields>节点

filed字段用于定义数据源字段所使用的搜索类型与相关设置。

<field name="id" type="long" indexed="true" stored="true" multiValued="false" required="true" />
<field name="name" type="text_ika" indexed="true" stored="true" multiValued="false" />
<field name="address" type="text_ika" indexed="true" stored="true" multiValued="false" />
<field name="description" type="text_ika" indexed="true" stored="true" multiValued="false" />
<field name="saturdayMerchant" type="boolean" indexed="true" stored="true" multiValued="false" />
<field name="huiMerchant" type="boolean" indexed="true" stored="true" multiValued="false" />
<field name="bankMerchant" type="boolean" indexed="true" stored="true" multiValued="false" />
<field name="rebate" type="int" indexed="true" stored="true" multiValued="false" />
<field name="valid" type="boolean" indexed="true" stored="true" multiValued="false" />
<field name="createTime" type="date" indexed="true" stored="true" multiValued="false" />
<field name="priority" type="int" indexed="true" stored="true" multiValued="false" />
<field name="telephone" type="string" indexed="true" stored="true" multiValued="false" />
<field name="city" type="text_ika" indexed="true" stored="true" multiValued="false" />
<field name="district_id" type="long" indexed="true" stored="true" multiValued="false" />
<field name="district_name" type="text_ika" indexed="true" stored="true" multiValued="false" />
<field name="merchantCategory_id" type="long" indexed="true" stored="true" multiValued="false" />
<field name="merchantCategory_name" type="text_ika" indexed="true" stored="true" multiValued="false" />
<field name="bank_id" type="long" indexed="true" stored="true" multiValued="true" />
<field name="bank_name" type="text_ika" indexed="true" stored="true" multiValued="true" />

<field name="all" type="text_ika" indexed="true" stored="false" multiValued="true" />

name:数据源字段名,搜索使用到。

type:搜索类型名例如中文ika搜索名text_ika,对应于fieldType中的name。不需要分词的字符串类型,string即可,如果需要分词,用上面配置好的分词type。

indexed:是否被索引,只有设置为true的字段才能进行搜索排序分片(earchable, sortable, facetable)。

stored:是否存储内容,如果不需要存储字段值,尽量设置为false以提高效率。

multiValued:是否为多值类型,SOLR允许配置多个数据源字段存储到一个搜索字段中。多个值必须为true,否则有可能抛出异常。

copyField节点

如果我们的搜索需要搜索多个字段该怎么办呢?这时候,我们就可以使用copyField。代码如下:

<copyField source="name" dest="all" />
<copyField source="address" dest="all" />
<copyField source="description" dest="all" />
<copyField source="city" dest="all" />
<copyField source="district_name" dest="all" />
<copyField source="merchantCategory_name" dest="all" />
<copyField source="bank_name" dest="all" />

我们将所有的中文分词字段全部拷贝至all中,当我们进行全文检索是,只用搜索all字段就OK了。

注意,这里的目标字段必须支持多值,最好不要存储,因为他只是做搜索。indexed为true,stored为false。

copyField节点和field节点都在fields节点之内。

问题又来了,如果需要根据不同的重要性进行区分,例如name的重要性比address大,该怎么办呢,后面再说这个问题。

uniqueKey节点

solr必须设置一个唯一字段,常设置为id,此唯一一段有uniqueKey节点指定。

例如:

 <uniqueKey>id</uniqueKey>

defaultSearchField节点

默认搜索的字段,我们已经将需要搜索的字段拷贝至all字段了,在这里设为all即可。

1 <defaultSearchField>all</defaultSearchField>

solrQueryParser节点

默认搜索操作符参数,及搜索短语间的逻辑,用AND增加准确率,用OR增加覆盖面,建议用AND,也可在搜索语句中定义。例如搜索“河西 万达”,使用AND默认搜索为“河西AND万达“。

1 <solrQueryParser defaultOperator="OR"/> 
时间: 2024-10-09 19:49:15

schema.xml的配置的相关文章

schema.xml文件配置

schema.xml是Solr一个配置文件,它包含了你的文档所有的字段,以及当文档被加入索引或查询字段时,这些字段是如何被处理的.这个文件被存储在Solr主文件夹下的conf目录下,默认的路径./solr/conf/schema.xml,也可以是Solr webapp的类加载器所能确定的路径.在下载的Solr包里,有一个schema的样例文件,用户可以从那个文件出发,来观察如何编写自己的Schema.xml. type节点 先来看下type节点,这里面定义FieldType子节点,包括name.

solr5.5教程-schema.xml部分配置

本文章全部内容均翻译自solr自带的配置文件. 1.Field结点说明 name: 必须的,field的名字 type:        必须的,fieldType部分所定义的type的名字 indexed:   如果想要这个字段被索引设置为true(可搜索或可排序) stored:     如果想要这个字段可以被还原,设置为true.通俗一点说,就是搜索的时候如果想要能查询出这个字段,应该设置为true. docValues: 如果这个字段应该有文档值(doc values),设置为true.文

solr的schema.xml配置属性解释

schema.xml做什么? SOLR加载数据,创建索引和数据时,核心数据结构的配置文件是schema.xml,该配置文件主要用于配置数据源,字段类型定义,搜索类型定义等.schema.xml的配置直接影响搜索结果的准确性与效率. <types></types>节点 types节点主要用于搜索类型的定义,这里给出常用类型的定义. 1 <fieldType name="string" class="solr.StrField" sortM

数据库中间件DBLE学习(二) 学习配置schema.xml

前言 一边有一个经常引诱我让我"娱乐至死"的视频,还有一个不停"鞭策"我让我快点学习的大BOSS.正是有这两种极端的爱才让我常常在自信中明白自己努力的方向.嗯,"人间不值得"! SCHEMA.XML介绍 上一篇写了:数据库中间件DBLE学习(一) 基本介绍和快速搭建,主要介绍快速安装.在安装的过程中,我们配置了schema.xml文件.schema.xml是一个比较重要的文件.该文件提供了逻辑库,逻辑表,分片规则,数据分片,物理数据库等配置.它主

我与solr(五)--关于schema.xml中的相关配置的详解

先把文件的代码贴上来: <?xml version="1.0" encoding="UTF-8" ?> <!-- 版权说明... --> <!-- 这是solr的chema 文件,这个文件应该被重命名为"schema.xml",而且他应该放在solrhome/core/conf文件下面. 获取你也能在solr webapp 的classload下面找到他. 更多的信息可以查看 http://wiki.apache.o

solr配置-Schema.xml

可参考配置:http://wiki.apache.org/solr/SchemaXml(基本上文档上面讲的已经很详细了) 先来看一下Schema.xml都有什么配置 1,uniqueKey 2,n多name不一样的fieldType 3,各种field :field,dynamicField,copyField 4,默认被注释掉的defaultSearchField,solrQueryParser,Similarity 下面来看一下具体都什么意思: 1,uniqueKey:文档的唯一标识.唯一键

(spring-第2回)Spring的Schema,基于XML的配置(在IoC容器中装配Bean的前奏片)

要深入了解Spring机制,首先需要知道Spring是怎样在IoC容器中装配Bean的.而了解这一点的前提是,要搞清楚Spring基于Schema的Xml配置方案. 在深入了解之前,必须要先明白几个标签的意思(我会逐步引导读者理解,刚开始的懵懂无所谓,读者自会渐入佳境.初极狭,才通人.复行数十步,豁然开朗.). 什么是XML Schema? 用来描述 XML文档的结构,也被简称为XSD(XML Schema Definition),是一些规则的集合.(方式:通过定义schema文件 如 spri

solr配置schema.xml学习

solr创建索引.添加数据的关键是配置schema.xml文件,该文件中主要是完成配置数据源.索引字段.数据类型等定义.同时,该文件的配置直接影响到solr搜索的效率和准确性. 一.搜索类型FileType name:指的是FileType的名字 class:指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为 <types> <fieldType name="string" class="solr.StrF

利用SOLR搭建企业搜索平台 之——模式配置Schema.xml

来源:http://blog.csdn.net/awj3584/article/details/16963525 schema.xml这个配置文件可以在你下载solr包的安装解压目录的\solr\example\solr\collection1\conf中找到,它就是solr模式关联的文件.打开这个配置文件,你会发现有详细的注释.模式组织主要分为三个重要配置 1. types 部分 是一些常见的可重用定义,定义了 Solr(和 Lucene)如何处理 Field.也就是添加到索引中的xml文件属