Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

bleveでGoに検索機能を用意する

More than 5 years have passed since last update.

bleveとは

http://www.blevesearch.com/

簡単に言うとテキスト検索エンジンです。
Go言語の様々な構造体をインデクシングして、任意のワードで検索できます。

bleveの特徴としては非常にシンプルなインターフェースで使えるので組み込みが楽ということが一番に挙げられます。
とはいえインデックスデータのバックアップやtf-idfでのスコアリングなどの機能も用意されていますし、コマンドラインツールもセットされています。

内部ではboltdbをデフォルトのデータストアとして使うようになっています。単純なkey/valueストアなので他のDBへの移行も可能かもしれません。

デモはこちらにあります。
http://wikisearch.blevesearch.com/search/

使い方

sample.go
package main

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

// 検索対象の構造体
type Document struct {
    Title string
    Body  string
    Like  int
}

func main() {
    // 新しいIndexを開く
    mapping := bleve.NewIndexMapping()
    index, _ := bleve.New("example.bleve", mapping)

    // 適当なデータをインデックスに登録する
    data := map[string]Document{
        "id1": Document{"test", "Lorem ipsum dolor sit amet,", 1},
        "id2": Document{"test2", "This is text.", 10},
    }
    for id, doc := range data {
        index.Index(id, doc)
    }

    // 検索してみる
    query := bleve.NewMatchQuery("text")
    search := bleve.NewSearchRequest(query)
    searchResults, _ := index.Search(search)

    // 結果を表示
    for _, match := range searchResults.Hits {
        fmt.Printf("ID: %v\n", match.ID)
        fmt.Printf("Score: %v\n", match.Score)
        doc := data[match.ID]
        fmt.Printf("Doc: %#v\n", doc)
    }
}

実行

$ go run bleve.go
ID: id2
Score: 0.7071067690849304
Doc: main.Document{Title:"test2", Body:"This is text.", Like:10}

これだけでIndexを自動保存しつつ検索することができるので非常に手軽ですね。

インデックスのカスタマイズなどはWikiやサンプルを読んでmappingをいじりましょう。

Tokenizerのカスタマイズやデータストアの変更などは追って調べてみようかと思います。

参考

y_matsuwitter
DMM.com CTO。正座してる人。
http://medium.com/@y_matsuwitter/
dmmcom
総合エンタテイメントサイト「DMM.com」を運営。会員数は2,900万人を突破。動画配信、FX、英会話、ゲーム、太陽光発電、3Dプリンタなど40以上のサービスを展開。沖縄での水族館事業参入、ベルギーでのサッカークラブ経営など、様々な事業を手掛ける。また2018年より若手起業家の支援を強化、「DMM VENTURES」による出資や、M&Aなどを積極的に展開している。
https://dmm-corp.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away