solr学习日记···索引更新

前面说到了索引的新增和schema配置文件对字段的配置。现在来了解一下索引的管理。例如,我们需要更新一下某个文档某个字段值的时候应该怎么做。
以下是solr更新处理器的常见请求:
1.添加:向索引添加一个或多个文档

<add>
    <doc>
        <field name="**">**</field>
    </doc>
    <doc>
        ```````````
    </doc>
</add>

2.删除:通过ID删除指定文档

<delete>
    <id>**</id>
</delete>

3.查询删除:类似于动态删除,根据查询的结果删除指定的文档,例如删除name=mmp的文档

<delete>
    <query>
        name:mmp
    </query>
</delete>

4.原子更新:原子更新针对的是文档字段的更新,包括修改,赋值等多种操作。也是通过id字段确定文档,然后再需要修改的字段中加上update属性,属性值为更新类型。

<add>
    <doc>
        <field name="id">**</field>
        <field update="??" name="**">**</field>
    </doc>
</add>

update取值:
set
用指定的值设置或替换字段原值,如果指定的值为空,则表示删除该值。
可以指定为单个值,也可以是多值字段的列表。

add
将指定的值添加到多值字段中。可以指定为单个值,或者一个列表。
如果操作的是一个已存在值的单值字段,会报错:multiple values encountered for non multiValued field title: **。如果文档中该字段无值则添加成功。

remove
从一个多值字段中删除所有出现的指定值。可以指定为单个值,或者一个列表。
如果操作的是一个单值字段则表示删除该字段。

removeregex
从多值字段中删除指定regex的所有事件。可以指定为单个值,或者作为一个列表。

inc
通过特定的数量来增加数值。必须指定为单个数值。这里要注意字段原值的类型,否则有可能报类型转换的错误。

既然提到原子更新,那么就要说一下就地更新(In-Place Updates):
就地更新与原子更新非常相似;在某种意义上,这是原子更新的一个子集。在常规的原子更新中,在更新的应用程序中,整个文档在内部被重新索引。但是,在这种方法中,只有被更新的字段会受到影响,文档的其余部分不会在内部重新索引。因此,就地更新的效率不受更新文档的大小的影响(即:字段的数量、字段的大小等等)。除了这些内部差异之外,原子更新和就地更新之间没有任何功能上的差异。
以上解释摘之官网:
https://lucene.apache.org/solr/guide/7_2/updating-parts-of-documents.html
只有在更新的字段满足以下三个条件时,才会使用就地更新:
1)非索引(index=”false”)、非存储(store=”false”)、单值(multiValued=”false”)数值(docValues=”true”)字段;
2)版本字段_version_也是一个非索引的、非存储的单值文档值字段;
3)更新字段的复制目标(也就是复制字段copyField),如果有的话,也是非索引的、非存储的单一值的数值doc取值字段。
就地更新只有setinc两种类型

在原子更新的操作中很有可能出现并发的情况,那么solr是怎么处理这种情况的呢?这就要介绍一下solr的乐观并发:
乐观并发是Solr的一个特性,通过在所有文档都默认存在一个版本字段_version_避免并发更新的情况。
如何使用乐观并发:
在提交的更新请求包含具体的_version_,例如

<add>
    <doc>
        <field name="id">**</id>
        <field update="**" name="**"></fidld>
        `````````````````````
        <field name="_version_">*</field>
    </doc>
</add>

solr处理这个更新请求,首先会将请求中的版本与最新版本比较,如果匹配则执行请求;反之则请求失败,返回错误信息。通常使用get请求获取最新的版本号。
除此之外,solr还针对_version_值设置了其它的更新策略:
1)值>1—–版本必须匹配,否则更新失败
2)值==1—–文档必须存在,不存在则更新失败
3)值==0—–文档不能存在,存在则更新失败
4)值<0—–无并发控制需要,若文档存在则被改写,反之添加

5.提交:向索引提交文档,有软提交和硬提交两种方式

<commit waitSearch="true" softCommit="false"/>

waitSearcher=“true”“false”——默认为true——直到一个新的搜索器被打开并注册为主查询搜索器,使更改可见。
softCommit=“true”“false”——默认为false——执行软提交

硬提交让文档可被搜索,但因为需要将其写入到持久存储器上,所以花销较大。
软提交也可以让文档被搜索,但不需要将其写入到持久存储器上。

而不管是硬提交还是软提交都可以采用一下三种策略实现自动提交:
1)指定时间自动提交
2)指定文档未提交数量阈值自动提交
3)指定间隔时间自动提交
自动提交的配置再solrconfig配置文件中进行,这个在介绍solrconfig配置文件的时候一起介绍。

6.优化:通过合并片段与去掉删除来优化索引

<optimize waitSearcher="false"/>

猜你喜欢

转载自blog.csdn.net/qq_19656425/article/details/78902856