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

本文详细介绍了Solr中索引的管理,包括添加、删除、原子更新(如set、add、remove、removeregex、inc)以及就地更新的条件和类型。此外,还讲解了Solr的乐观并发控制以及提交(软提交、硬提交)和优化索引的概念,强调了版本字段在并发控制中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面说到了索引的新增和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"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值