在文章软删除softDeletes(一)中我们介绍了软删除的一些应用,从本篇文章开始,将根据索引(index)、flush/commit、段的合并、搜索这几个不同的阶段来介绍跟软删除相关的内容。
索引(index)
阅读本小结内容必须掌握文章文档的增删改(下)(part 2)中的知识点,故下文中出现的一些名词不会作详细的介绍。
索引(index)这个阶段,即文档的增删改的阶段,由于软删除属于删除操作,故对应的删除信息会被添加到全局的deleteQueue中,deleteQueue中存放了四种类型的删除信息,这四种删除信息用下图中的Node对象来描述:
图1:
上图中的四种删除信息通过IndexWriter类中提供的方法生成:
- QueryArrayNode:deleteDocuments(Querys)
- TermArrayNode:deleteDocuments(Terms)
- DocValuesUpdatesNode:updateBinaryDocValue( )、updateNumericDocValue( )、updateDocValues( )、softUpdateDocument( )、softUpdateDocuments( )
- TermNode:updateDocument(Term, Document)、updateDocuments( Term, Documents)
由上文可以看出,软删除对应的删除信息将会由DocValuesUpdatesNode来描述,
我们通过一个例子来看下DocValuesUpdatesNode中描述了哪些删除信息:
图2:
图2中,第56行执行了软删除的操作,它对应的删除信息DocValuesUpdatesNode包含如下信息:
图3:
DocValuesUpdatesNode中包含了两个对象:next、item,其中next用来指向deleteQueue中下一个删除信息(见文章文档的增删改(下)(part 2)),item(NumericDocValuesUpdate对象)中的type描述了使用NUMERIC类型的DocValues来描述被软删除的文档,item中的term描述了满足被软删除的文档的条件,即包含域名为"abc"、域值为"document3"的文档都会被软删除。
上述DocValuesUpdatesNode的信息我们可以看出,我们获得了满足软删除的条件,但是没有指出软删除的作用范围(作用域),例如在图2中,文档3也满足被软删除的条件,但是这篇文档是在第56行的软删除操作之后添加的,那么这次的软删除不能作用(apply)到这篇文档,即这次的软删除操作只能对文档1生效,故我们还需要根据DocValuesUpdatesNode的信息进一步完善删除信息,即添加软删除的作用范围,不同的删除信息在完善删除信息后用下列的容器来描述(Lucene 7.5.0):
- Map<Term,Integer> deleteTerms :TermArrayNode、TermNode
- Map<Query,Integer> deleteQueries:QueryArrayNode
- Map<String,LinkedHashMap<Term,NumericDocValuesUpdate>> numericUpdates:DocValuesUpdatesNode
- Map<String,LinkedHashMap<Term,BinaryDocValuesUpdate>> binaryUpdate:DocValuesUpdatesNode
BufferedUpdates类、deleteTerms、deleteQueries的内容在文章文档的增删改(下)(part 2)中已经作出了介绍,不赘述。
如果DocValuesUpdatesNode中item中的type为NUMERIC,那么对应生成numericUpdates,如果item中的type为BINARY,那么对应生成binaryUpdate。
看这里:https://www.amazingkoala.com.cn/Lucene/Index/2020/0621/149.html