LoginSignup
17
12

More than 5 years have passed since last update.

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

Posted at

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

参考

17
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
12