如何写一个微信公众号搜索引擎

引言

云滩公众号搜索引擎是利用 Go中文分词 和 bleve 构建的。
本文将展示整个搜索引擎的构建过程。

分析

如何写一个微信公众号搜索引擎_第1张图片

http://mp.weixin.qq.com/s/sgc8IzjkbSikS2YIJdO1QA

随便打开一篇公众号文章然后查看他的源代码

如何写一个微信公众号搜索引擎_第2张图片

我们可以通过正则表达式获取这里的数据用于构建唯一的 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

需要帮助的话扫微信

如何写一个微信公众号搜索引擎_第3张图片

如果觉得文章好,对你有帮助就来关注我吧。

你可能感兴趣的:(如何写一个微信公众号搜索引擎)