我们定义一个文档由那些字段就是通过配置schema.xml里的fields部分来决定的,它就相当于关系型数据库里的字段一样。
这里主要有5种字段,分别是:
- Required fields
- Multivalued fields
- Dynamic fields
- Copy fields
- Unique key field
1 Required fields
先来看一下Required fields部分的大致结构
<field name="screen_name"
type="string"
indexed="true"
stored="true" />
每一个就是一个字段:
- name 就是字段名称
- type 数据类型
- indexed 是否对该字段建立索引
- stored 是否保存,设置为true则会在搜索结果里显示该字段的内容,否则不显示
2 Multivalued fields
<field name="link"
type="string"
indexed="true"
stored="true"
multiValued="true"/>
这种类型就是把multiValued属性设置为true,它作用就是可以在同一个字段上添加多条内容,比如:
<add>
<doc>
<field name="id">2</field>
...
<field name="link">http://manning.com/grainger/</field>
<field name="link">http://lucene.apache.org/solr/</field>
...
</doc>
</add>
3 Dynamic fields
<dynamicField name="*_s" type="string" indexed="true" stored="true" />
这种类型的字段并没有把字段名称写死,而是通过前缀或者后缀通配符来匹配字段名称,只要是符合这个通配符的字段名称都适用于它所定义的属性。它的属性设置和第一第二两种类型的配置方式一样,你同样可以设置它为第二种类型,即multiValued=”true”。
适用它有三个好处:
■ Modeling documents with many fields
■ Supporting documents from diverse sources
■ Adding new document sources
也就是说不再局限于写死的fields了,这里可以灵活在提交的文档里添加新的字段,比如不用Dynamic fields时我要这样定义字段
<field name="facebook_f1" type="string" indexed="true" stored="true" />
<field name="facebook_f2" type="string" indexed="true" stored="true" />
<field name="facebook_fn" type="string" indexed="true" stored="true" />
...
<field name="twitter_f1" type="string" indexed="true" stored="true" />
<field name="twitter_f2" type="string" indexed="true" stored="true" />
<field name="twitter_fn" type="string" indexed="true" stored="true" />
但是现在我可以用一句话搞定
<dynamicField name="*_s" type="string" indexed="true" stored="true" />
我在提交文档的时候只需这样
<add>
<doc>
<field name="id">9999012345678</field>
<field name="screen_name">@thelabdude</field>
<field name="type">post</field>
...
<field name="facebook_f1_s">hello</field>
<field name="facebook_f2_s">world</field>
<field name="twitter_f1_s">foo</field>
<field name="twitter_f2_s">bar</field>
</doc>
</add>
4 Copy fields
<field name="catch_all"
type="text_en"
indexed="true"
stored="false"
multiValued="true"/>
首先在fields里定义一个字段,它可以把多个字段合并到这个字段,它必须设置stored=”false”,multiValued=”true”。
然后设置它的拷贝关系,它的位置和fields>是平级的,是兄弟关系。
<schema>
<fields>
...
</fields>
<copyField source="screen_name" dest="catch_all" />
<copyField source="text" dest="catch_all" />
<copyField source="link" dest="catch_all" />
<types>
...
</types>
上面是把text和link字段拷贝到catch_all字段,这样我们在搜索的时候假如要同时搜索text和link时就不用显示的去指定搜索text和link字段,而是直接用catch_all字段就可以了。
5 Unique key field
<uniqueKey>id</uniqueKey>
它就相当于数据库的主键一样,但是要注意的它的类型最好设置为原始的数据类型,比如string或者long,否则可能导致返回的结果有误,这个坑我是遇到过,我一般设置我的主键为string类型。