elsearm is an Elasticsearch model library for Go.
- Only has elastic/go-elasticsearch as a dependency.
- Easy update/remove to Elasticsearch when saving to DB.
- Can set prefix and suffix of index name.
Automatic Document Updates (with GORM)
If the ORM library support hooks, you can use Automatic Document Updates with libraries other than GORM.
This is an example of using GORM.
package models
import (
"github.com/soranoba/elsearm"
"gorm.io/gorm"
)
const (
elsearmIndexerKey = "elsearm:indexer"
)
func UseElsearmIndexer(db *gorm.DB, indexer *elsearm.Indexer) *gorm.DB {
return db.InstanceSet(elsearmIndexerKey, indexer)
}
func getElsearmIndexer(db *gorm.DB) (*elsearm.Indexer, bool) {
val, ok := db.InstanceGet(elsearmIndexerKey)
if !ok {
return nil, false
}
indexer, ok := val.(*elsearm.Indexer)
return indexer, ok
}
type User struct {
ID uint `gorm:"primarykey" json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (u *User) AfterDelete(db *gorm.DB) error {
if indexer, ok := getElsearmIndexer(db); ok {
indexer.Delete(u)
}
return nil
}
func (u *User) AfterSave(db *gorm.DB) error {
if indexer, ok := getElsearmIndexer(db); ok {
indexer.Update(u)
}
return nil
}
func main() {
db := (func() *gorm.DB {
return /* do anything */
})()
indexer := elsearm.NewIndexer(ct.es)
db = models.UseElsearmIndexer(db, indexer)
/* do anyting */
db.Create(&models.User{})
}
You can set prefix and/or suffix in global config.
It makes it easy to avoid overwrite to the same index when it execute testings.
elsearm.SetGlobalConfig(elsearm.GlobalConfig{
IndexNameSuffix: "_test",
})