请教关于solr schema.xml fieldtype 的几个属性含义的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教关于solr schema.xml fieldtype 的几个属性含义的问题相关的知识,希望对你有一定的参考价值。
1. dynamicField 的作用是什么?如果你需要在schema.xml文件中的<field> ......</field>部分定义多个<field>(math_score,chinese_score,english_score,....),而恰好这些<field>的type属性又相同(type="integer"),那么就可以借助 dynamicField 用一个句子完成
这样,在一个document中,就可以使用math_score,chinese_score,english_score 这些字段名,虽然在schema.xml文件中并未对它们进行一一定义。
dynamicField就是动态栏位, 要是你有太多栏位无法一一设定,你可以用dynamicField处理像下面这第一个dynamicField就是说, 所有栏位是以 _i做结尾的 (如 a_i, sss_i, id_i等等)都套用这个设定.
<dynamicField name="*_i" type="integer" indexed="true" stored="true"/>
<dynamicField name="*_t" type="text" indexed="true" stored="true"/>
<dynamicField name="*_f" type="float" indexed="true" stored="true"/>
<dynamicField name="*_b" type="boolean" indexed="true" stored="true"/>
<dynamicField name="*_d" type="date" indexed="true" stored="true"/>
<dynamicField name="*_s" type="string" indexed="true" stored="true"/>
<dynamicField name="*_ri" type="sint" indexed="true" stored="true"/>
<dynamicField name="*_rf" type="sfloat" indexed="true" stored="true"/>
<dynamicField name="*_facet" type="string" indexed="true" stored="true"/>
</fields>
2. sortMissingLast 和 sortMissingFirst对<field>的属性之一。只在对该<field>进行排序时,才起作用。
sortMissingLast = true时,那些在该<field>上没有值的documents将被排在那些在该<field>上有值的documents之后。
sortMissingFirst = true时的情况正好相反。
如果两者都设为false,则使用Lucene的排序。
3. positionIncrementGap=100 只对 multiValue = true 的fieldType有意义。
http://svn.apache.org/repos/asf/lucene/solr/trunk/example/solr/conf/schema.xml
Suppose a document has a multi-valued "author" field. Like this:
author: John Doe
author: Bob Smith
With a position increment gap of 0, a phrase query of "doe bob" would
be a match. But often it is undesirable for that kind of match across
different field values. A position increment gap controls the virtual
space between the last token of one field instance and the first token
of the next instance. With a gap of 100, this prevents phrase queries
(even with a modest slop factor) from matching across instances.
4. omitNorms
什么是Norm,现在还不懂????
5. LowerCaseFilterFactory的作用。
例如Kobe Bryant在分词后 kobe 不能搜索到结果 Kobe可以,虽然这个是中文分词
法,但经常有中英混输的情况,如果在输入英文后,查不到结果,也是比较失望的,
另外我看了你的源代码,建议在词库的引进上采用单例模式,在web应用上会比较好,
谢谢你的帮助,另外我看了solol的mmseg的接口比较不错,你是否有意看看,另外再
次感谢你的solr分词
Comment 1 by chenlb2008, Aug 16, 2009英文小写,好办,用 <filter class="solr.LowerCaseFilterFactory"/> 就行,详情请
看:http://blog.chenlb.com/2009/04/solr-chinese-segment-mmseg4j-use-demo.html
solol 基本没看,我只是怕看了会影响我的设计思路。
也准备实现 http://chenlb.javaeye.com/blog/439843 提到的一些功能。
多谢你的关注。希望继续提出你的看法。
以下内容是从网上找到的
=====================
Solr schema.xml 的介绍
Tuesday, 1. April 2008, 07:23:25
solr
原来我是打算将Solr wiki里的介绍直接翻译成中文, 後来写一写觉得, 翻译的内容太复杂, 很难懂. 所以在这里我就直接拿一个schema.xml范例来介绍好了. 希望能帮助大家了解schema.xml
<?xml version="1.0" ?>
The Solr schema file. This file should be named "schema.xml" and should be in the conf directory under the solr home (i.e. ./solr/conf/schema.xml by default) or located where the classloader for the Solr webapp can find it.
For more information, on how to customize this file, please see… wiki.apache.org/solr/SchemaXml
<schema name="solr" version="1.1">
资料型态, 你的资料可能要分很多不同型态做资料建置以便solr引擎做检索, 就像一般资料库一样, 要对存入的资料做型态分类. 以下有string, boolean, integer, long, float, double 等等的资料型态, 就依你的须求做设定. 每一个fieldtype 都有几个参数可设定, 其中name就是你给这个fieldtype的名子, 你可以随你的方便取名. class是solr用的,就不可以乱取, 要针对你这个fieldtype的资料型态来告诉solr这个fieldtype里的资料是什麼样类型的资料,如 integer, text, string, long等等.
後面的sortMissingLast, omitNorms等设定你可以参考solr wiki schemalXml的介绍, 再依你的须求使用. 请参考下列范例.
<types>
<fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldtype name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>
<fieldtype name="integer" class="solr.IntField" omitNorms="true"/>
<fieldtype name="long" class="solr.LongField" omitNorms="true"/>
<fieldtype name="float" class="solr.FloatField" omitNorms="true"/>
<fieldtype name="double" class="solr.DoubleField" omitNorms="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="date" class="solr.DateField" sortMissingLast="true" omitNorms="true"/>
如果是TextField的资料型态, 你可以用不同的Analyzer, Tokenizer, Filter对这个fieldtype的资料做处理. 像是中文切词, 删除前後空白, 或同义词等等. 可依你的须求使用. 请参考下列范例.
<fieldtype name="text_ws" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
</analyzer>
</fieldtype>
<fieldtype name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldtype>
<fieldtype name="textTight" class="solr.TextField" positionIncrementGap="100" >
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldtype>
</types>
设置好资料fieldType的型态後, 就是将这些fieldType套入对应的document fields. 只能多不能少. 也就是说假设你有一个document里有 id, name, default等资料, 你的schema.xml不可以只有id, default这两个field. 你一定要还要有name这个field. 但是你schema.xml里若有id, name, defualt, text这四个栏位, 你的document却可以只有id, default这两个栏位.
<fields>
<field name="id" type="string" indexed="true" stored="true"/>
上面这个栏位(field)是给你document里的id栏用, 型态为string, 要index, 也要储存在你的资料库里
<field name="default" type="text" indexed="true" stored="false" multiValued="true"/>
<field name="name" type="text" indexed="true" stored="false" multiValued="true"/>
dynamicField就是动态栏位, 要是你有太多栏位无法一一设定,你可以用dynamicField处理像下面这第一个dynamicField就是说, 所有栏位是以 _i做结尾的 (如 a_i, sss_i, id_i等等)都套用这个设定.
<dynamicField name="*_i" type="integer" indexed="true" stored="true"/>
<dynamicField name="*_t" type="text" indexed="true" stored="true"/>
<dynamicField name="*_f" type="float" indexed="true" stored="true"/>
<dynamicField name="*_b" type="boolean" indexed="true" stored="true"/>
<dynamicField name="*_d" type="date" indexed="true" stored="true"/>
<dynamicField name="*_s" type="string" indexed="true" stored="true"/>
<dynamicField name="*_ri" type="sint" indexed="true" stored="true"/>
<dynamicField name="*_rf" type="sfloat" indexed="true" stored="true"/>
<dynamicField name="*_facet" type="string" indexed="true" stored="true"/>
</fields>
uniqueKey就像一般database的primary key一样, 也就是说整个资料库里的每一笔资料的id栏位不可以与另一笔资料的id栏位有相同值.
<uniqueKey>id</uniqueKey>
defaultSearchField就是你在做query搜寻时若不指定特定栏位做检索时, Solr就会只查这个栏位.
<defaultSearchField>default</defaultSearchField>
copyField是用来复制你一个栏位里的值到另一栏位用. 如你可以将name里的东西copy到default里, 这样solr做检索时也会检索到name里的东西.
<copyField source="name" dest="default"/>
这里defaultOperator设为 "AND", 就是说当你输入的查寻词句有空白时 ex. "远东 餐厅", Solr搜寻解析器会当做你的query指令为"远东AND餐厅". 若是设为 "OR" 就会变成"远东OR餐厅".
<solrQueryParser defaultOperator="AND"/>
</schema>
这就是一个简单的schema.xml介绍! 参考技术A solr schema.xml FieldType属性详解
fieldType 公共属性:
name:标识。
class:行为对应的类
可选的属性:
sortMissingLast和sortMissingFirst两个属性是用在可以内在使用String排序的类型上(包括:string,boolean,sint,slong,sfloat,sdouble,pdate)。
sortMissingLast=”true”:没有该field的数据排在有该field的数据之后,而不管请求时的排序规则。
sortMissingFirst=”true”:没有该field的数据排在有该field的数据之前,而不管请求时的排序规则。
indexed:是否被用来建立索引(关系到搜索和排序)
stored:是否储存
compressed:[false],是否使用gzip压缩(只有TextField和StrField可以压缩)
mutiValued:是否包含多个值,即一个名字可以被多个document所用。
omitNorms:这是个高级选项。设置为true,省略与这一field相关的规范(这将禁用长度规范化和索引时间权重( index-time boosting for the field),并节省一些内存)。仅仅用在全文本field。
positionIncrementGap=N :可选属性,定义在同一个文档中此类型数据的空白间隔数,避免短语匹配错误。
[Solr] schema.xml中定义字段
通过本文,你将学习到:
solr中字段的概念
字段的必要属性
多值的字段
动态字段
复制字段
唯一键字段
solr 中字段的概念
说起solr中的字段(field),我们要先搞清楚文档(document)是什么。事实上,Solr的基本信息单位就是document,document是用来描述某种事物的。如果你有面向对象的编程经验,“某种事物”是很好理解的,假设我们要开发一个手表搜索应用,我们认为下面表格中的字段,对于描述手表“这种事物”来说是必不可少的:
字段 | 值 |
id | 1 |
watchName | 日志型 II |
model | 116300 |
description | 该腕表于2009年面世,在其增大的表壳内,蕴含了劳力士最新的技术 |
正如上面的表格所示,我们选取了手表来代表solr中的document。在现实生活中,还有很多这样的例子,比如说,如果你使用书籍代表document,那么它可能有:作者、出版时间、页数、价格等等字段。
字段的必要属性
对于每个字段而言,它必要包含一个唯一的,在构建查询时被使用的名字,比如说:watchName:日志型II。这个查询意味着用户要查询名称(watchName)为:日志II的手表。对于该字段的定义,请参考下面的代码片段:
[html] view plain copy
<field name="watchName"
type="string"
indexed="true"
stored="true" />
通俗的说,上面的这种定义意味着名为“watchName”的字段将会存储一个类型为string的值,并且该字段将会被索引和被存储。每个字段都必须使用type来定义其类型,同时每个字段也要定义它是否被索引和(或)被存储。被索引的字段能够被搜索和排序;被存储的字段能够在搜索结果中显示出来。
多值的字段
上面我们用来描述手表的字段,是很简单的,现在我们考虑这样一种场景,“日志型II”也被称为“DateJust II”,如果用户搜索“watchName:DateJust”,很明显他们是看不到希望的结果的。solr提供了这样一种机制:多值字段。它可以使用多个值填充到同一个字段。在schema.xml中,你可以通过在字段上设置multiValued="true"来表示该字段是一个多指的字段:
[html] view plain copy
<field name="watchName"
type="string"
indexed="true"
stored="true"
multiValued="true"/>
</span>
动态字段
在我们的手表示例中,watchName和model字段都是string类型的,这两个字段除了name属性不一样之外,其他属性(indexed,stored)都是相同的。想象一下,除了这两个字段之外,如果我们还有几十个string的字段,我们是不是应该为它们中的每一个的在schema.xml中定义呢?如果还有其他类型相同,其他属性也形同,仅仅是名称不同的字段呢?请看如下定义:
[html] view plain copy
<field name="field1" type="string" indexed="true" stored="true" />
<field name="field2" type="string" indexed="true" stored="true" />
<field name="field3" type="string" indexed="true" stored="true" />
...
<field name="field4" type="string" indexed="true" stored="true" />
<field name="field5" type="string" indexed="true" stored="true" />
<field name="fieldn" type="string" indexed="true" stored="true" />
事实上,solr提供了一种叫做动态字段的机制:动态字段允许在你的document中任何字段应用相同的定义,只要字段的名字匹配前缀或者后缀表达式(就像s_*或者*_s)中的一个。动态字段使用一个特殊的命名机制以应用相同的字段定义针对任何符合这种通配符式样模式的字段。使用动态字段,我们可以通过很简单的代码来达到同样的效果:
[html] view plain copy
<dynamicField name="*_s" type="string" indexed="true" stored="true" />
你也可以为多值的字段使用动态字段,即在动态字段定义中加上multiValued="true"属性。
复制字段
在大多数的搜索应用中,用户会看到一个可以输入查询的简单的搜索框。这种途径的目的是帮助你的用户快速地找到document,而不必填充一个复杂的表单。想象下,用户在watchName字段上搜索“116300“(手表的型号),这种情况下用户是不能找的他们心仪的结果的,因为”116300“被保存在名为”model“的字段上而不是”watchName“字段上。其实复制字段与传统数据库的的某些机制有些类似,比如我们可以用SQL模拟下当前的情景:
[sql] view plain copy
where watchName like ‘%116300%’ or model like '116300'
对于solr而言,它提供<copyField>指令使得从你的document众多其他字段来创建一个单一的包罗万象的字段,该字段包含若干个由我们指定的字段的文本。
首先,你需要定义一个目标字段,其他字段的值将会被复制到该字段,让我们称之为“catch_all”:
[html] view plain copy
<field name="catch_all"
type="text_en"
indexed="true"
stored="false"
multiValued="true"/>
请注意,"catch-all"字段不应该被存储,因为它是由其他字段填充的;此外,如果有一个源字段是多值的,那么目标字段应该也是多值的。
然后,我们需要告诉Solr从哪些字段中复制(使用<copyField>机制)。下面的清单显示了,我们如何使用<copyField>机制,从watchName, model, 和 description字段中复制值到我们的“catch_all”字段。
[html] view plain copy
<schema>
<fields>
...
</fields>
<copyField source="watchName" dest="catch_all" />
<copyField source="model" dest="catch_all" />
<copyField source="description" dest="catch_all" />
<types>
...
</types>
</schema>
唯一键字段
唯一键比较容易理解,它使用一个独一无二的ID值使得你的文档唯一的被识别在索引中。在schema.xml中,它的定义如下:
[html] view plain copy
<uniqueKey>id</uniqueKey>
以上是关于请教关于solr schema.xml fieldtype 的几个属性含义的问题的主要内容,如果未能解决你的问题,请参考以下文章