知识分享之Golang——Bleve的NewIndexMapping解析
背景
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。
知识分享系列目前包含Java、Golang、Linux、Docker等等。
开发环境
- 系统:windows10
- 语言:Golang
- 组件库:Bleve
- golang版本:1.17
- 组件官网:http://blevesearch.com/
- 组件仓库:https://github.com/blevesearch/bleve
- 开源协议:Apache-2.0 License
内容
在 bleve 中,IndexMapping 描述了您的数据模型应该如何被索引。 默认索引映射(default IndexMapping) 获取方式: indexMapping := bleve.NewIndexMapping() IndexMappings 包含您想要支持的每种不同类型的文档的 DocumentMappings。此外,它包含一个 DefaultDocumentMapping,它将用于没有显式映射的任何类型。
即我们一个对象中有四个属性,其中一个属性做了显示的DocumentMapping,其他没有,则其他三个都将存储在DefaultDocumentMapping中。
Document Type 文件类型 bleve 如何知道文档的类型?
- 如果您的对象实现了该接口,bleve.Classifier那么 bleve 将使用其Type()方法返回的字符串。
- IndexMapping 有一个名为TypeField. 您可以将其设置为任何文档路径,如果该路径的值是字符串,则该值将用作类型字段。如果您没有自定义此设置,则默认设置为“_type”。
- 如果无法从 1 或 2 确定类型,则类型将设置为 IndexMapping 的DefaultType。如果您没有自定义此设置,则默认设置为“_default”。
DocumentMappings
现在我们看到了 bleve 如何确定类型,我们可以为我们感兴趣的每种类型提供一个自定义的 DocumentMapping。 假设我们有一个名为blog. 我们可以为这种类型构建一个 DocumentMapping 并配置 IndexMapping 以使用它:
代码语言:javascript复制blogMapping := bleve.NewDocumentMapping()
indexMapping.AddDocumentMapping("blog", blogMapping)
我们还可以通过设置 DefaultMapping 字段来设置一个包罗万象的映射,该映射将用于没有显式映射的任何类型。
FieldMappings 字段映射
文档是分层的并包含命名字段。这些字段可以是值或嵌套的子文档。我们通过为其设置 DocumentMapping 来自定义命名字段的行为。一旦我们为命名字段创建了 DocumentMapping,我们就可以将 0 个或多个 FieldMappings 附加到它。FieldMappings 描述了我们希望如何解释字段以及我们希望插入索引的内容。
假设我们的博客文档有一个字符串字段,name并且我们想对这个字段使用英语分析器。
代码语言:javascript复制nameFieldMapping := bleve.NewTextFieldMapping()
nameFieldMapping.Analyzer = "en"
blogMapping.AddFieldMappingsAt("name", nameFieldMapping)
现在假设我们的博客文档有一个嵌套结构,author使用子字段name和来描述字段email。这次假设我们想要索引(默认)但不存储作者姓名。我们希望从该_all字段中排除电子邮件地址。
代码语言:javascript复制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 - 用于该字段的命名分析器 如果未指定显式分析器,则可以在多个级别上配置默认分析器。
- 每个 DocumentMapping 都有一个字段DefaultAnalyzer。这意味着您可以覆盖每个子文档的默认分析器。
- 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。
知识共享许可协议
本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。