知識分享之Golang——Bleve的NewIndexMapping解析
背景
知識分享之Golang篇是我在日常使用Golang時(shí)學(xué)習(xí)到的各種各樣的知識的記錄,將其整理出來以文章的形式分享給大家,來進(jìn)行共同學(xué)習(xí)。歡迎大家進(jìn)行持續(xù)關(guān)注。
知識分享系列目前包含Java、Golang、Linux、Docker等等。
開發(fā)環(huán)境
- 系統(tǒng):windows10
- 語言:Golang
- 組件庫:Bleve
- golang版本:1.17
- 組件官網(wǎng):http://blevesearch.com/
- 組件倉庫:https://github.com/blevesearch/bleve
- 開源協(xié)議:Apache-2.0 License
內(nèi)容
在 bleve 中,IndexMapping 描述了您的數(shù)據(jù)模型應(yīng)該如何被索引。
默認(rèn)索引映射(default IndexMapping)
獲取方式:
indexMapping := bleve.NewIndexMapping()
IndexMappings 包含您想要支持的每種不同類型的文檔的 DocumentMappings。此外,它包含一個 DefaultDocumentMapping,它將用于沒有顯式映射的任何類型。
即我們一個對象中有四個屬性,其中一個屬性做了顯示的DocumentMapping,其他沒有,則其他三個都將存儲在DefaultDocumentMapping中。
Document Type 文件類型
bleve 如何知道文檔的類型?
- 如果您的對象實(shí)現(xiàn)了該接口,bleve.Classifier那么 bleve 將使用其Type()方法返回的字符串。
- IndexMapping 有一個名為TypeField. 您可以將其設(shè)置為任何文檔路徑,如果該路徑的值是字符串,則該值將用作類型字段。如果您沒有自定義此設(shè)置,則默認(rèn)設(shè)置為“_type”。
- 如果無法從 1 或 2 確定類型,則類型將設(shè)置為 IndexMapping 的DefaultType。如果您沒有自定義此設(shè)置,則默認(rèn)設(shè)置為“_default”。
DocumentMappings
現(xiàn)在我們看到了 bleve 如何確定類型,我們可以為我們感興趣的每種類型提供一個自定義的 DocumentMapping。
假設(shè)我們有一個名為blog. 我們可以為這種類型構(gòu)建一個 DocumentMapping 并配置 IndexMapping 以使用它:blogMapping := bleve.NewDocumentMapping() indexMapping.AddDocumentMapping("blog", blogMapping)
我們還可以通過設(shè)置 DefaultMapping 字段來設(shè)置一個包羅萬象的映射,該映射將用于沒有顯式映射的任何類型。
FieldMappings 字段映射
文檔是分層的并包含命名字段。這些字段可以是值或嵌套的子文檔。我們通過為其設(shè)置 DocumentMapping 來自定義命名字段的行為。一旦我們?yōu)槊侄蝿?chuàng)建了 DocumentMapping,我們就可以將 0 個或多個 FieldMappings 附加到它。FieldMappings 描述了我們希望如何解釋字段以及我們希望插入索引的內(nèi)容。
假設(shè)我們的博客文檔有一個字符串字段,name并且我們想對這個字段使用英語分析器。
nameFieldMapping := bleve.NewTextFieldMapping() nameFieldMapping.Analyzer = "en" blogMapping.AddFieldMappingsAt("name", nameFieldMapping)
現(xiàn)在假設(shè)我們的博客文檔有一個嵌套結(jié)構(gòu),author使用子字段name和來描述字段email。這次假設(shè)我們想要索引(默認(rèn))但不存儲作者姓名。我們希望從該_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 中一些其他標(biāo)志的使用。這是清單:
Index - 索引此字段,默認(rèn)為 true
Store - 存儲此字段,默認(rèn)為 true
IncludeTermVectors - 包括該字段的術(shù)語向量,默認(rèn)為 true
IncludeInAll - 在名為 的復(fù)合字段中包含此字段_all,默認(rèn)為 true
我理解的這段是我們假設(shè)有一個文件,并且這個文件有各種各樣的屬性,其中文件名、作者、上傳人、我們都可以使用該類方式進(jìn)行設(shè)置為單獨(dú)的field,便于索引時(shí)快速使用,后續(xù)我們進(jìn)行編寫測試demo進(jìn)行調(diào)試代碼看是否是這樣的。
Text Field 特定選項(xiàng)
Analyzer - 用于該字段的命名分析器
如果未指定顯式分析器,則可以在多個級別上配置默認(rèn)分析器。
- 每個 DocumentMapping 都有一個字段DefaultAnalyzer。這意味著您可以覆蓋每個子文檔的默認(rèn)分析器。
- IndexMapping 也有一個DefaultAnalyzer(默認(rèn)分詞器).
將DefaultAnalyzer使用與字段匹配的最長路徑的配置。
Date Field 特定選項(xiàng)
DateFormat - 將用于解析存儲為字符串的日期的 DateTimeParser 的名稱
您可以在 IndexMapping 對象中配置 DefaultDateTimeParser。
依舊按照文件來講,我們可以將上傳時(shí)間或文件的修改時(shí)間使用這個特定的時(shí)間類型,這樣我們進(jìn)行范圍搜索時(shí)就可以有效進(jìn)行搜索了。
理解Default Type與Default Mapping
當(dāng) Bleve 無法確定特定文檔是哪種類型時(shí),它會自動分配 DefaultType。
一旦 Bleve 確定了類型,它就會查找與此類型名稱匹配的 DocumentMapping。如果沒有為此類型顯式配置的 DocumentMapping,則使用 DefaultMapping。
DefaultType 將默認(rèn)為“_default”,而 DefaultMapping 將默認(rèn)為空的默認(rèn) DocumentMapping。
考慮來自啤酒搜索示例應(yīng)用程序的示例。該映射描述了“啤酒”和“啤酒廠”兩種類型。對于這些中的每一個,都提供了一個明確的 DocumentMapping。如果您嘗試索引缺少 type 字段的文檔,它將被分配類型“_default”。然后 Bleve 查看是否有為“_default”配置的映射。沒有,所以 Bleve 繼續(xù)使用 DefaultMapping。
本文聲明:
知識共享許可協(xié)議
本作品由 cn華少 采用 知識共享署名-非商業(yè)性使用 4.0 國際許可協(xié)議 進(jìn)行許可。