其他 schema 元素–默认搜索字段

在使用lucene查询解析器时,如果没有指定字段名称,将在 defaultSearchField 进行查询。DisMax 和 扩展的 DisMax 查询解析中不会使用这个值。
定义默认查询字段格式如下:

<defaultSearchField>text</defaultSearchField>

其中 text 为字段名称。

其他 schema 元素–uniqueKey

uniqueKey 元素用来表示一个文档的唯一值,类似数据库ID。尽管uniqueKey不是必须,但在程序设计过程中还是建议使用。举个例子,在更新一个文档时,需要通过uniqueKey来找到需要更新的文档。uniqueKey在schema中是这样定义的:

<uniqueKey>id</uniqueKey>

动态字段

动态字段(Dynamic fields)允许 solr 索引没有在 schema 中明确定义的字段。这个在忘记定义一些字段时很有用。动态字段可以让系统更灵活,通用性更强。
动态字段和成规字段类似,除了它名字中包含一个通配符外,在索引文档时,一个字段如果在常规字段中没有匹配时,将到动态字段中匹配。
假设schema中定义了一个叫*_i的动态动态字段,如果要索引一个叫 cost_i 的字段,但是 schema 中不存在 cost_i 的字段,这样 cost_i  将被索引到 *_i 字段中。
动态字段也是定义在 schema.xml 文件中,和其他字段一样,它也有个名词,字段类型,和属性。

<dynamicField name="*_i" type="sint" indexed="true" stored="true"/>

建议在 schema.xml 定义一些基本的动态字段,以备扩展之用。

复制字段

你可能想让document的一些字段可以多次使用。solr 有一个字段复制机制,可以提交多个不同类型字段集中到一个字段。字段复制主要涉及两个概念,source和destination,一个是要复制的字段,另一个是要复制到哪个字段,以下是个例子:

<copyField source="cat" dest="text" maxChars="30000" />

上例中,如果text字段有数据的话,cat字段的内容将被添加到text字段中。maxChars 参数,一个int类型参数,用于限制复制的字符数。

source和destination都支持通配符。以下是一个将所有以 _t 结尾的字段全部复制到text字段中。

<copyField source="*_t" dest="text" maxChars="25000" />

定义字段

一旦定义好了字段类型,定义一个字段就变得比较简单了。所有该做的就是指定一个名称和一个字段类型。如果你愿意,可以提供可选的内容用于替换字段类型中的定义的属性。

字段定义在 schema.xml 的 fields 元素下,以下的例子定义了一个 sfloat 类型的 price 字段。

<field name="price" type="sfloat" indexed="true" stored="true"/>

查询数据

索引完数据就可以进行查询了。启动solr服务后,打开 http://localhost:8983/solr/admin/ 页面,Query String 的值是“*:*”代表查询全部的意思,点击【search】按钮,返回一个xml文件,如下所示:
现在我们看一下 url:http://localhost:8983/solr/select/?q=*%3A*&version=2.2&start=0&rows=10
solr查询过程,是把查询条件放在url中提交给服务器的q这个参数放的就是url编码过的查询条件。start是查询的其实位置,从0开始编号,rows是返回的条数,加入想做翻页,每页15条,这样取第三页就传入start=30&rows=15。默认的查询结果是xml格式,也可以返回json格式,在查询url后加wt=json即可,wt是writeType的缩写,参数后加wt=json的效果如下:

 

字段属性使用实例

实例

Indexed

Stored

multiValued

omitNorms

termVectors

termPosition

搜索 True
返回内容 true
作为唯一值 true False
排序 true False True[1]
使用字段boosts[5] False
文档boosts影响字段范围搜索 false
高亮 true[4] true [2] True[3]
层面[5] true
添加多个值,包括排序 true
字段长度影响文档评分 false
更多相似[5] True[6]

说明:

1:推荐但不是必须

2:如果存在将生效,但不是必须

3:如果termVectors=true

4:该字段必须定义一个分词器,但是它不是必须被索引

5:在Understanding Analyzers, Tokenizers, and Filters中有描述

6:Term vectors 不是强制的,如果不是true,保存的字段将被分词。所以推荐使用term

Vectors,同时必须保证stored=false

字段类型的属性

字段类型的类决定了字段的大部分形态,同时部分属性在schema.xml中也是可以定义的。举个例子,以下顶了日期类型的两个属性:sortMissingLast 和 omitNorms:

<fieldType name=”date”

sortMissingLast=”true” omitNorms=”true”/>

大部分的属性是 true 或 false。

这里是一些常用的属性:

 

字段属性

描述

indexed

如果为true,该字段可以被搜索

True 或 false

stored

如果为true,该字段可以值将被保存在索引库

True或 false

sortMissingFirst

sortMissingLast

X暂时不太理解

True或 false

multiValued

如果为true,该字段可以保存多个值

True或 false

positionIncrementGap

用于多值字段,表示多个值之间的距离,防止错误的短语匹配

整数

omitNorms

如果为true,忽略该字段的norms,只有全文字段或者字段在索引时设置boost需要norms。

True或 false

omitTermFreqAndPositions

True或 false

autoGeneratePhraseQueries

日期的处理

DateField 表示一个精确到毫秒的时间,值的格式是:
YYYY-MM-DDThh:mm:ssZ

YYYY 表示年.
MM 表示月.
DD 表示日.
hh 表示24小时制的小时.
mm 表示分钟.
ss 表示秒.

值的注意的是上面的那个时间格式里没有时区;带时区的时间格式可以通过格林尼治时间表示。这里是一个示例的值:
1972-05-20T17:33:18Z

另一个带毫秒的例子:
1972-05-20T17:33:18.772Z

另外,DataField也支持日期计算。这个可以方便创建相对于当前时间的时间点。可以用这个表达从现在往后两个月:
+2MONTHS

这个表示一天以前:
-1DAY

使用/可以表示当前的某部分时间,这个表示当前的小时:
/HOUR

当然也能组合表达式,以下表示的是六个月零三天以后的日(一个月的第几天):
+6MONTHS+3DAYS/DAY

Solr 查询参数之 sort

sort 参与用于决定查询结果按升序(asc)或降序(desc)排列。这个参数可以用在数字或字母内容字段。
Solr 可以对查询结果按文档的得分或者被索引的单值字段(该字段在 schema.xml 文件中定义,同时 multiValued=”false” 和 indexed=”true”)的值进行排序。
如果想对一个字段同时进行层面搜索和排序,可以使用 ,来克隆一个字段,然后在这个字段上进行搜索,在克隆字段上进行排序。
以下是例子说明:
无:
没有指定 sort 参数时,搜索结果默认按文档得分(score)的降序(desc)排列
price asc:
按价格字段升序排列
inStock desc,price asc:
按 inStock 字段降序排列,如果字段值相同时,再按 pirce 字段升序排列

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress   闽ICP备18020075号-1