引言
云滩公众号搜索引擎是利用 Go中文分词 和 bleve 构建的。
本文将展示整个搜索引擎的构建过程。
分析
http://mp.weixin.qq.com/s/sgc8IzjkbSikS2YIJdO1QA
随便打开一篇公众号文章然后查看他的源代码
我们可以通过正则表达式获取这里的数据用于构建唯一的 URL 地址。
这段内容这是标题,摘要和缩略图
文章则放在 div#js_content
里面,于是可以通过 goquery 来获取文章的内容。
构建文档数据结构
type Document struct {
ID string `json:"uri"`
Title string `json:"title,omitempty"`
Summary string `json:"summary,omitempty"`
Content string `json:"content,omitempty"`
Meta string `json:"meta,omitempty"`
CreatedAt int64 `json:"created_at,omitempty"`
}
-
Document.ID
为拼装的链接地址 -
Document.Title
为标题 -
Document.Summary
为摘要 -
Document.Content
为内容 -
Document.Meta
为额外信息,如封面图 -
Document.CreatedAt
为创建时间
创建 Mapping 并使用 sego 分词
tokenizer
我自己构建出来的分词微服务
_mapping := bleve.NewIndexMapping()
_mapping.AddCustomTokenizer("sego",
map[string]interface{}{
"host": *tokenizerHost,
"type": tokenizer.Name,
}
)
_mapping.AddCustomAnalyzer("sego",
map[string]interface{}{
"type": custom.Name,
"char_filters": []string{
html.Name,
},
"tokenizer": "sego",
"token_filters": []string{
"possessive_en",
"to_lower",
"stop_en",
},
},
)
_mapping.DefaultAnalyzer = tokenizer.Name
创建索引并索引文章
index, err := bleve.New("weixin-search.bleve", _mapping)
doc := Document{....}
index.Index(doc.ID, doc)
搜索查询
index, _ := bleve.Open("weixin-search.bleve")
query := bleve.NewQueryStringQuery("剽悍晨读")
searchRequest := bleve.NewSearchRequest(query)
searchResult, _ := index.Search(searchRequest)
结语
到此为止搜索引擎基本完成。
Demo: http://t.cn/RaphK4a
完整的代码我会在合适的时候发布到 Github 上面,敬请期待。
需要使用的话,详见: http://www.jianshu.com/p/221e056c9251
需要帮助的话扫微信
如果觉得文章好,对你有帮助就来关注我吧。