文档的增删改(一)
Lu Xugang Lv6

  在Lucene中,可以对文档(Document)进行添加(增)、删除(删)、更新(改)的操作,而每一种操作各自又有多个功能的扩展。

文档的增删改应用

添加文档

  该小结介绍增删改的简单使用方法。
图1:

图2:

  Lucene允许通过IndexWriter对象添加一篇文档或者多篇文档。

  • 添加一篇文档:图1中,我们添加了一篇文档,该文档中包含三个域,分别是DocValues域"author"、存储域"content"、点数据域"coordinate"
  • 添加多篇文档:图2中,我们添加了两篇文档

删除文档

图3:

  删除文档的操作可以根据Term、Query进行删除:

  • 根据Term删除文档:图3的第99行,包含域名为"content",域值为"abc"的文档都满足删除要求
  • 根据Query删除文档:图3的第101行,使用TermQuery进行查询,满足查询要求的文档都会被删除
  • 删除所有文档:删除所有的文档

更新文档

图4:

图5:

  允许更新一篇或多篇文档,更新文档是一个先删除、后添加的过程。

  • 更新一篇文档:图4中,先删除所有包含域名为"content",域值为"a"的文档,并且添加一篇新的文档,该文档包含一个存储域"newField",域值为"newFieldValue"
  • 更新多篇文档:图5中,先删除所有包含域名为"author",域值为"Shakespeare"的文档,并且添加两篇新的文档

图6:

  Lucene7.5.0版本中提供了三种更新文档的DocValues域的方法。

  • 更新NumericDocValueField:图6的124行,包含域名"author",域值为"ShakeSpare"的所有文档的域名为“age”的NumericDocValueField的域值更新为23。注意的是,索引中必须存在域名为"age"的NumericDocValueField,在更新过程前,会通过一个全局的globalFieldNumberMap的Map对象检查是否存在该域名,不存在则抛出异常。
  • 更新BinaryDocValueField:图6的126行,包含域名"subject",域值为"Calculus"的所有文档,这些文档的域名为“inventor”的BinaryDocValueField的域值更新为"Leibniz"。注意的是,索引中必须存在域名为"inventor"的BinaryDocValueField,在更新过程前,会通过一个全局的globalFieldNumberMap的Map对象检查是否存在该域名,不存在则抛出异常。
  • 批量更新DocValues域:批量的更新DocValues域,但是目前版本只能允许更新NumericDocValueField或BinaryDocValueField,跟单独更新DocValues域不同的是,该方法不会检查当前索引中是否存在待更新的域名,如果没有则直接添加,但如果待更新的域名已经存在并且对应的DocValues域的类型不是BinaryDocValueField或者NumericDocValueField,那么抛出异常

图7:

  软删除(softDelete)也属于文档的更新,支持添加一篇或多篇文档,图4及图5中的更新文档是 先删除、后添加的过程,而软删除则是先标记、后添加

  软删除的概念会在后面的文章中详细介绍。

  • 添加一篇文档:图7的140行,先标记所有包含域名为"content",域值为"a"的文档,使得这些文档添加一个域名"softDelete",域值"1"的NumericDocValuesField的域,然后添加一篇新的文档,该文档包含一个存储域"author",域值为"a"
  • 添加多篇文档:图7中150行,先标记所有包含域名为"content",域值为"a"的文档,使得这些文档添加一个域名"softDelete",域值"3"的NumericDocValuesField的域,然后添加两篇新的文档

文档的增删改原理

  上一节中介绍文档的增删改的方法即:

  添加/更新一篇文档操作:

  • 添加一篇文档:addDocument( )
  • 更新一篇文档:updateDocument( )
  • 软删除中的添加一篇文档:softUpdateDocument( )

  添加/更新多篇文档操作:

  • 添加多篇文档:addDocuments( )
  • 更新多篇文档:updateDocuments( )
  • 软删除中的添加多篇文档:softUpdateDocuments( )

  删除文档操作:

  • 按照Term进行删除:deleteDocuments(Terms)
  • 按照Query进行删除:deleteDocuments(Querys)
  • 删除所有文档:deleteAll( )

  更新DocValues域操作:

  • 更新BinaryDocValues:updateBinaryDocValue( )
  • 更新NumericDocValues:updateNumericDocValue( )
  • 更新多个DocValues:updateDocValues( )

文档的增删改流程图

  单文档跟多文档的添加/更新操作的流程图略有不同:

单文档的增删改流程图

图8:

点击查看大图

多文档的增删改流程图

图9:

点击查看大图

  从图8跟图9的流程图中可以看出,尽管有多种增删改的操作,但其相同的逻辑部分重合度是很高的,另外没有列出删除出所有文档的操作,即deleteAll( )。该操作暂时不作介绍,原因是一方面这个操作在实际业务中几乎不会使用,另一方该操作的流程完全不同于其他的增删改操作,展开介绍则需要另外开一章节,感觉没这个必要。

结语

  本章节介绍了文档增删改的应用及其流程图,由于流程图的每一个步骤展开介绍会使得本篇文章篇幅过大,故在下一篇文章中介绍。

点击下载附件

 Comments