Golang实现的搜索引擎
##使用过程中遇到任何问题,请联系QQ: 316052486
详细用法见: github.com/aosen/searchserver
##思维脑图
#几个重要结构体 ##搜索引擎初始化结构体
type EngineInitOptions struct {
// 半角逗号分隔的字典文件,具体用法见
//分词器接口
Segmenter SearchSegmenter
// 停用词文件
StopTokenFile string
// 分词器线程数
NumSegmenterThreads int
// 索引器和排序器的shard数目
// 被检索/排序的文档会被均匀分配到各个shard中
NumShards int
// 索引器的信道缓冲长度
IndexerBufferLength int
// 索引器每个shard分配的线程数
NumIndexerThreadsPerShard int
// 排序器的信道缓冲长度
RankerBufferLength int
// 排序器每个shard分配的线程数
NumRankerThreadsPerShard int
// 索引器初始化选项
IndexerInitOptions *IndexerInitOptions
// 默认的搜索选项
DefaultRankOptions *RankOptions
// 是否使用持久数据库,以及数据库文件保存的目录和裂分数目
UsePersistentStorage bool
//索引持久化
//pipline接口
SearchPipline SearchPipline
//索引器生成方法
CreateIndexer func() SearchIndexer
}
##建立索引结构体
type DocumentIndexData struct {
// 文档全文(必须是UTF-8格式),用于生成待索引的关键词
Content string
// 文档的关键词
// 当Content不为空的时候,优先从Content中分词得到关键词。
// Tokens存在的意义在于绕过内置的分词器,在引擎外部
// 进行分词和预处理。
Tokens []TokenData
// 文档标签(必须是UTF-8格式),比如文档的类别属性等,这些标签并不出现在文档文本中
Labels []string
// 文档的评分字段,可以接纳任何类型的结构体
Fields interface{}
}
##建立索引
func (engine *Engine) IndexDocument(docId uint64, data DocumentIndexData)
##搜索请求结构体
type SearchRequest struct {
// 搜索的短语(必须是UTF-8格式),会被分词
// 当值为空字符串时关键词会从下面的Tokens读入
Text string
// 关键词(必须是UTF-8格式),当Text不为空时优先使用Text
// 通常你不需要自己指定关键词,除非你运行自己的分词程序
Tokens []string
// 文档标签(必须是UTF-8格式),标签不存在文档文本中,但也属于搜索键的一种
Labels []string
// 当不为空时,仅从这些文档中搜索
DocIds []uint64
// 排序选项
RankOptions *RankOptions
// 超时,单位毫秒(千分之一秒)。此值小于等于零时不设超时。
// 搜索超时的情况下仍有可能返回部分排序结果。
Timeout int
}
##搜索查询符合条件的文档
func (engine *Engine) Search(request SearchRequest) (output SearchResponse)
##搜索引擎返回结构体
type SearchResponse struct {
// 搜索用到的关键词
Tokens []string
// 搜索到的文档,已排序
Docs []ScoredDocument
// 搜索是否超时。超时的情况下也可能会返回部分结果
Timeout bool
}
#开发进度
- 2015-01-14 增加pipline对mysql的支持
- 2015-01-08 目前打分器只支持BM25, 排序必须依靠BM25进行排序,接下来需要让引擎支持更多的打分规则。
- 2015-01-06 打分器接口话 done
- 2015-01-06 排序器接口话 done
- 2015-01-06 索引器接口话 done
- 2015-12-17 分词器接口化 done
- 2015-12-17 优化目录结构 done
- 2015-12-17 优化搜索效率 done
- 2015-12-04 增加索引存储方式: mongodb done