solr之fields配置

我们定义一个文档由那些字段就是通过配置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类型。

by David_Ao

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值