bleve搜索引擎源码分析之索引——mapping和lucene一样,也有_all

简介:

例子:

复制代码
package main

import (
    "fmt"
    "github.com/blevesearch/bleve"
)

func main() {
    // open a new index
    mapping := bleve.NewIndexMapping()
    index, err := bleve.New("example.bleve", mapping)
    if err != nil {
        fmt.Println(err)
        return
    }

    data := struct {
        Name string
        Des  string
    }{
        Name: "hello world this is bone",
        Des:  "this is a good time",
    }

    // index some data
    index.Index("id", data)

    // search for some text
    query := bleve.NewMatchQuery("this is bone")
    search := bleve.NewSearchRequest(query)
    searchResults, err := index.Search(search)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(searchResults)
}
复制代码

mapping这里:

// NewIndexMapping creates a new IndexMapping that will use all the default indexing rules
func NewIndexMapping() *mapping.IndexMappingImpl {
    return mapping.NewIndexMapping()
}

难道是使用和lucene一样的???

复制代码
// NewIndexMapping creates a new IndexMapping that will use all the default indexing rules
func NewIndexMapping() *IndexMappingImpl {
    return &IndexMappingImpl{
        TypeMapping:           make(map[string]*DocumentMapping),
        DefaultMapping:        NewDocumentMapping(),
        TypeField:             defaultTypeField,
        DefaultType:           defaultType,
        DefaultAnalyzer:       defaultAnalyzer,
        DefaultDateTimeParser: defaultDateTimeParser,
        DefaultField:          defaultField,
        IndexDynamic:          IndexDynamic,
        StoreDynamic:          StoreDynamic,
        CustomAnalysis:        newCustomAnalysis(),
        cache:                 registry.NewCache(),
    }
}
复制代码

 

New就是设置索引目录和mapping。

// New index at the specified path, must not exist.
// The provided mapping will be used for all
// Index/Search operations.
func New(path string, mapping mapping.IndexMapping) (Index, error) {
    return newIndexUsing(path, mapping, Config.DefaultIndexType, Config.DefaultKVStore, nil)
}

index文档实现:

复制代码
// Index adds the specified index operation to the
// batch.  NOTE: the bleve Index is not updated
// until the batch is executed.
func (b *Batch) Index(id string, data interface{}) error {
    if id == "" {
        return ErrorEmptyID
    }
    doc := document.NewDocument(id)
    err := b.index.Mapping().MapDocument(doc, data)
    if err != nil {
        return err
    }
    b.internal.Update(doc)
    return nil
}
复制代码

其中,NewDocument实现:

复制代码
type Document struct {
    ID              string  `json:"id"`
    Fields          []Field `json:"fields"`
    CompositeFields []*CompositeField
    Number          uint64 `json:"-"`
}

func NewDocument(id string) *Document {
    return &Document{
        ID:              id,
        Fields:          make([]Field, 0),
        CompositeFields: make([]*CompositeField, 0),
    }
}
复制代码

MappingDocument实现:

复制代码
func (im *IndexMappingImpl) MapDocument(doc *document.Document, data interface{}) error {
    docType := im.determineType(data)
    docMapping := im.mappingForType(docType)
    walkContext := im.newWalkContext(doc, docMapping)
    if docMapping.Enabled {
        docMapping.walkDocument(data, []string{}, []uint64{}, walkContext)

        // see if the _all field was disabled
        allMapping := docMapping.documentMappingForPath("_all")
        if allMapping == nil || (allMapping.Enabled != false) {
            field := document.NewCompositeFieldWithIndexingOptions("_all", true, []string{}, walkContext.excludedFromAll, document.IndexField|document.IncludeTermVectors)
            doc.AddField(field)
        }
    }

    return nil
}
复制代码

我晕,看来bleve真的是和lucene设计一样!也有_all属性。

难道后面倒排列表也会使用skip list???

 














本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6592188.html,如需转载请自行联系原作者

相关文章
|
3月前
|
存储 搜索推荐 API
探究:Elasticsearch 文档的 _id 是 Lucene 的 docid 吗?
【8月更文挑战第31天】在深入探索Elasticsearch(简称ES)这一强大的搜索引擎时,了解其底层存储机制——特别是与Lucene的关系,对于优化查询性能、设计高效的数据模型至关重要。其中,一个常见且容易引发误解的问题便是:Elasticsearch中文档的_id字段是否直接等同于Lucene的docid?本文将通过图文并茂的方式,详细剖析这一问题,帮助读者理解两者之间的微妙关系。
88 0
|
5月前
|
算法 索引
一篇文章讲明白Lucene学习总结之九:Lucene的查询对象(2)
一篇文章讲明白Lucene学习总结之九:Lucene的查询对象(2)
21 0
|
SQL 机器学习/深度学习 自然语言处理
全面解剖 Solr query 到lucene query
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。围绕从顶之下,从粗到西的关系认识solr 查询流程和实现细节。最低下定位到queryparse的实现。整个过程围绕信息检索这一思路展开,而不是工程实现来看这个问题。目的从整体结构上认识查询这一块的抽象。这样有具体需求的时候,可以知晓参照按个query、从哪个点注入系统中比较省事,而无需侵入solr、lucene底层。
276 0
全面解剖 Solr query 到lucene query
|
存储 自然语言处理 数据库
Lucene 查询原理
# 前言 Lucene 是一个基于 Java 的全文信息检索工具包,目前主流的搜索系统Elasticsearch和solr都是基于lucene的索引和搜索能力进行。想要理解搜索系统的实现原理,就需要深入lucene这一层,看看lucene是如何存储需要检索的数据,以及如何完成高效的数据检索。
8647 1
|
自然语言处理 索引 存储
|
Java Apache 索引
Lucene实现全文检索技术(包含SpringBoot整合Lucene 7.6.0 )
Lucene实现全文检索的流程 ① 绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括: 确定原始内容即要搜索的内容à采集文档à创建文档à分析文档à索引文档 ② 红色表示搜索过程,从索引库中搜索内容,搜索过程...
3838 0