知识分享之Golang——Bleve的NewIndexMapping解析

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

知识分享之Golang——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。

本文声明:

5330898-d1c72b6c90e378f3.png
知识共享许可协议
本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。

目录
相关文章
|
6天前
|
人工智能 Go 调度
掌握Go并发:Go语言并发编程深度解析
掌握Go并发:Go语言并发编程深度解析
|
6天前
|
Go 索引
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
|
6天前
|
存储 缓存 安全
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
|
6天前
|
存储 编译器 BI
掌握Go语言:Go语言基础构建模块解析,优缺点及进销存项目实战(2)
掌握Go语言:Go语言基础构建模块解析,优缺点及进销存项目实战(2)
|
6天前
|
Go 开发者
Go语言并发模型概览:CSP模型解析
【2月更文挑战第17天】Go语言以其强大的并发处理能力在编程领域崭露头角。其中,CSP(Communicating Sequential Processes)模型作为Go语言并发模型的核心之一,在并发编程中发挥着至关重要的作用。本文将深入解析CSP模型的基本原理及其在Go语言中的应用,帮助读者更好地理解Go语言的并发编程特性。
|
6天前
|
存储 缓存 安全
Go语言内存模型深度解析
【2月更文挑战第16天】Go语言以其简洁的语法、强大的并发编程能力和高效的内存管理而备受开发者青睐。本文将对Go语言的内存模型进行深度解析,探讨其内存布局、内存分配与回收机制以及内存安全等方面的内容,帮助读者更好地理解和应用Go语言的内存管理特性。
|
6天前
|
JSON Go 数据格式
【Golang】解决使用interface{}解析json数字会变成科学计数法的问题
【2月更文挑战第9天】解决使用interface{}解析json数字会变成科学计数法的问题
60 0
|
6天前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
|
6天前
|
存储 Java Go
Go 语言切片如何扩容?(全面解析原理和过程)
Go 语言切片如何扩容?(全面解析原理和过程)
16 2
|
6天前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。

推荐镜像

更多