bleveとは
簡単に言うとテキスト検索エンジンです。
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のカスタマイズやデータストアの変更などは追って調べてみようかと思います。