在上一节中,我们已经成功搭建了Solr后台,并且在后台中新建了一个核(core)
,本节将介绍Solr配置域。
我们在后台系统中选择core1
,点击Documents
,在里面添加一个Document(文档)
,内容如下:
{"id":"1","name":"jitwxs"}
点击Submit按钮执行成功:
然后选择Query
,查询条件设为*.*
,即查询所有,就可以看见我们刚刚插入的Doucment
:
在Lucene初探——基于Lucene 6.6.2这篇文章中,我们已经知道了一个Document
中可以有多个域(field)
,这里的id
和name
就是这个文档的域。
我们打开core1的conf
文件夹,其中有两个重要的配置文件需要我们掌握,一个是managed-schema
,一个是solrconfig.xml
,其中是managed-schema
就是Solr对域的配置文件。
field和fieldType
打开managed-schema
文件,首先介绍下field
标签,这里是Solr帮我们预设好的域,如图示:
属性名 | 含义 |
---|---|
name | 域的名字 |
type | 域的类型 |
indexed | 是否索引 |
stored | 是否存储 |
required | 是否必须 |
multiValued | 是否允许多值(多个数值,数组一样) |
域的类型Solr也为我们定义好了,部分如下:
我们发现,之前我们添加的域filed
和域name
都是Solr定义过的,且id
是require
的,因此我们后面每次添加Document
,都必须包含id域。
值得注意的是,域必须得在该配置文件中配置过后,才能够使用,否则无法使用!!!
dynamicField
如果想添加一个域叫abcdefg
,那么需要在配置文件中添加一行:
<field name="abcdefg" ... />
但是每次修改配置文件都需要重启Solr服务,有没有更方便的方法呢?其实有的,Solr贴心的帮我们想好了自定义Filed问题,其中有一个dynamicField
标签,列举其中一部分如下:
我们发现域名是正则表达式
的形式,因此只要我们的域匹配了正则表达式,就无需自己定义,比如将abcdefg
修改为abcdefg_s
就匹配了*_s
的域,这样就可以不用自己定义了。
copyField
假设我们有一堆文章,我们想要搜索作者包含jitwxs或者描述中包含jitwxs的文章,但是作者信息存在author
域中,描述信息存在description
域中。难道我们要在两个域中分别查一次吗,当然不是,这就牵扯到了copyField
。
如图所示,配置文件中定义了一堆copyField
,其中就有author
和description
,我们发现这两个域的dest
属性均为text
。
当我们修改author
域或者description
域的时候,因为配置了copyField
,Solr会自动将内容拷贝到dest
的目标域,即text
域。当我们查询的时候,就不会去查询author
域或者description
域,而是直接查询text
域。