Posted at

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のカスタマイズやデータストアの変更などは追って調べてみようかと思います。


参考