Bleve的NewIndexMapping解析

时间:2022-8-1     作者:smarteng     分类: Go语言


Bleve的NewIndexMapping解析

背景

知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。
知识分享系列目前包含Java、Golang、Linux、Docker等等。

开发环境

内容

在 bleve 中,IndexMapping 描述了您的数据模型应该如何被索引。
默认索引映射(default IndexMapping)
获取方式:
indexMapping := bleve.NewIndexMapping()
IndexMappings 包含您想要支持的每种不同类型的文档的 DocumentMappings。此外,它包含一个 DefaultDocumentMapping,它将用于没有显式映射的任何类型。

即我们一个对象中有四个属性,其中一个属性做了显示的DocumentMapping,其他没有,则其他三个都将存储在DefaultDocumentMapping中。

Document Type 文件类型
bleve 如何知道文档的类型?

  1. 如果您的对象实现了该接口,bleve.Classifier那么 bleve 将使用其Type()方法返回的字符串。
  2. IndexMapping 有一个名为TypeField. 您可以将其设置为任何文档路径,如果该路径的值是字符串,则该值将用作类型字段。如果您没有自定义此设置,则默认设置为“_type”。
  3. 如果无法从 1 或 2 确定类型,则类型将设置为 IndexMapping 的DefaultType。如果您没有自定义此设置,则默认设置为“_default”。

DocumentMappings

现在我们看到了 bleve 如何确定类型,我们可以为我们感兴趣的每种类型提供一个自定义的 DocumentMapping。
假设我们有一个名为blog. 我们可以为这种类型构建一个 DocumentMapping 并配置 IndexMapping 以使用它:

blogMapping := bleve.NewDocumentMapping()
indexMapping.AddDocumentMapping("blog", blogMapping)

复制
我们还可以通过设置 DefaultMapping 字段来设置一个包罗万象的映射,该映射将用于没有显式映射的任何类型。

FieldMappings 字段映射

文档是分层的并包含命名字段。这些字段可以是值或嵌套的子文档。我们通过为其设置 DocumentMapping 来自定义命名字段的行为。一旦我们为命名字段创建了 DocumentMapping,我们就可以将 0 个或多个 FieldMappings 附加到它。FieldMappings 描述了我们希望如何解释字段以及我们希望插入索引的内容。
假设我们的博客文档有一个字符串字段,name并且我们想对这个字段使用英语分析器。

nameFieldMapping := bleve.NewTextFieldMapping()
nameFieldMapping.Analyzer = "en"
blogMapping.AddFieldMappingsAt("name", nameFieldMapping)

复制
现在假设我们的博客文档有一个嵌套结构,author使用子字段name和来描述字段email。这次假设我们想要索引(默认)但不存储作者姓名。我们希望从该_all字段中排除电子邮件地址。

author := bleve.NewDocumentMapping()
authorNameFieldMapping := bleve.NewTextFieldMapping()
authorNameFieldMapping.Store = false
author.AddFieldMappingsAt("name", authorFieldNameMapping)
authorEmailFieldMapping := bleve.NewTextFieldMapping()
authorEmailFieldMapping.IncludeInAll = false
author.AddFieldMappingsAt("email", authorEmailFieldMapping)
blog.AddSubDocumentMapping("author", author)

复制
这显示了 FieldMapping 中一些其他标志的使用。这是清单:
Index - 索引此字段,默认为 true
Store - 存储此字段,默认为 true
IncludeTermVectors - 包括该字段的术语向量,默认为 true
IncludeInAll - 在名为 的复合字段中包含此字段_all,默认为 true
我理解的这段是我们假设有一个文件,并且这个文件有各种各样的属性,其中文件名、作者、上传人、我们都可以使用该类方式进行设置为单独的field,便于索引时快速使用,后续我们进行编写测试demo进行调试代码看是否是这样的。

Text Field 特定选项
Analyzer - 用于该字段的命名分析器
如果未指定显式分析器,则可以在多个级别上配置默认分析器。

  1. 每个 DocumentMapping 都有一个字段DefaultAnalyzer。这意味着您可以覆盖每个子文档的默认分析器。
  2. IndexMapping 也有一个DefaultAnalyzer(默认分词器).
    将DefaultAnalyzer使用与字段匹配的最长路径的配置。

Date Field 特定选项
DateFormat - 将用于解析存储为字符串的日期的 DateTimeParser 的名称
您可以在 IndexMapping 对象中配置 DefaultDateTimeParser。

依旧按照文件来讲,我们可以将上传时间或文件的修改时间使用这个特定的时间类型,这样我们进行范围搜索时就可以有效进行搜索了。

理解Default Type与Default Mapping
当 Bleve 无法确定特定文档是哪种类型时,它会自动分配 DefaultType。
一旦 Bleve 确定了类型,它就会查找与此类型名称匹配的 DocumentMapping。如果没有为此类型显式配置的 DocumentMapping,则使用 DefaultMapping。
DefaultType 将默认为“_default”,而 DefaultMapping 将默认为空的默认 DocumentMapping。
考虑来自啤酒搜索示例应用程序的示例。该映射描述了“啤酒”和“啤酒厂”两种类型。对于这些中的每一个,都提供了一个明确的 DocumentMapping。如果您尝试索引缺少 type 字段的文档,它将被分配类型“_default”。然后 Bleve 查看是否有为“_default”配置的映射。没有,所以 Bleve 继续使用 DefaultMapping。