在上一节中,我们已经成功搭建了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域。

本文介绍了如何在Solr中配置域,包括预设的field和fieldType,以及如何使用dynamicField和copyField来提高搜索效率。

被折叠的 条评论
为什么被折叠?



