From 26358c5b9b78d214fdd20a70351cd49f02054f03 Mon Sep 17 00:00:00 2001 From: dengliming Date: Fri, 10 Apr 2020 23:34:11 +0800 Subject: [PATCH 1/2] Support FT.SYNADD FT.SYNUPDATE FT.SYNDUMP commands --- redisearch/client.go | 46 +++++++++++++++++++++++++++++++++++++++ redisearch/client_test.go | 42 +++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/redisearch/client.go b/redisearch/client.go index 0d67b75..aee4af6 100644 --- a/redisearch/client.go +++ b/redisearch/client.go @@ -539,3 +539,49 @@ func (i *Client) GetTagVals(index string, filedName string) ([]string, error) { args := redis.Args{index, filedName} return redis.Strings(conn.Do("FT.TAGVALS", args...)) } + +// Adds a synonym group. +func (i *Client) SynAdd(indexName string, terms []string) (int64, error) { + conn := i.pool.Get() + defer conn.Close() + + args := redis.Args{indexName}.AddFlat(terms) + return redis.Int64(conn.Do("FT.SYNADD", args...)) +} + +// Updates a synonym group. +func (i *Client) SynUpdate(indexName string, synonymGroupId int64, terms []string) (string, error) { + conn := i.pool.Get() + defer conn.Close() + + args := redis.Args{indexName, synonymGroupId}.AddFlat(terms) + return redis.String(conn.Do("FT.SYNUPDATE", args...)) +} + +// Dumps the contents of a synonym group. +func (i *Client) SynDump(indexName string) (map[string][]int64, error) { + conn := i.pool.Get() + defer conn.Close() + + args := redis.Args{indexName} + values, err := redis.Values(conn.Do("FT.SYNDUMP", args...)) + if err != nil { + return nil, err + } + + valLen := len(values) + if valLen%2 != 0 { + return nil, errors.New("SynDump: expects even number of values result") + } + + m := make(map[string][]int64, valLen/2) + for i := 0; i < valLen; i += 2 { + key := values[i].([]byte) + gids, err := redis.Int64s(values[i+1], nil) + if err != nil { + return nil, err + } + m[string(key)] = gids + } + return m, nil +} diff --git a/redisearch/client_test.go b/redisearch/client_test.go index fe7cfc7..b3d6b29 100644 --- a/redisearch/client_test.go +++ b/redisearch/client_test.go @@ -470,3 +470,45 @@ func TestClient_GetTagVals(t *testing.T) { assert.NotNil(t, err) assert.Nil(t, tags) } + +func TestClient_SynAdd(t *testing.T) { + c := createClient("testsynadd") + + sc := NewSchema(DefaultOptions). + AddField(NewTextField("name")). + AddField(NewTextField("addr")) + c.Drop() + err := c.CreateIndex(sc) + assert.Nil(t, err) + + gid, err := c.SynAdd("testsynadd", []string{"girl", "baby"}) + assert.Nil(t, err) + assert.True(t, gid >= 0) + ret, err := c.SynUpdate("testsynadd", gid, []string{"girl", "baby"}) + assert.Nil(t, err) + assert.Equal(t, "OK", ret) +} + +func TestClient_SynDump(t *testing.T) { + c := createClient("testsyndump") + + sc := NewSchema(DefaultOptions). + AddField(NewTextField("name")). + AddField(NewTextField("addr")) + c.Drop() + err := c.CreateIndex(sc) + assert.Nil(t, err) + + gid, err := c.SynAdd("testsyndump", []string{"girl", "baby"}) + assert.Nil(t, err) + assert.True(t, gid >= 0) + + gid2, err := c.SynAdd("testsyndump", []string{"child"}) + + m, err := c.SynDump("testsyndump") + assert.Contains(t, m, "baby") + assert.Contains(t, m, "girl") + assert.Contains(t, m, "child") + assert.Equal(t, gid, m["baby"][0]) + assert.Equal(t, gid2, m["child"][0]) +} From 323b9f2f11aef8c11d3a55a43c56e410ef10d115 Mon Sep 17 00:00:00 2001 From: dengliming Date: Fri, 10 Apr 2020 23:41:00 +0800 Subject: [PATCH 2/2] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6583a7a..ba9968d 100644 --- a/README.md +++ b/README.md @@ -97,9 +97,9 @@ func ExampleClient() { | [FT.SUGGET](https://oss.redislabs.com/redisearch/Commands.html#ftsugget) | [SuggestOpts](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Autocompleter.SuggestOpts) | | [FT.SUGDEL](https://oss.redislabs.com/redisearch/Commands.html#ftsugdel) | [DeleteTerms](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Autocompleter.DeleteTerms) | | [FT.SUGLEN](https://oss.redislabs.com/redisearch/Commands.html#ftsuglen) | [Autocompleter.Length](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Autocompleter.Length) | -| [FT.SYNADD](https://oss.redislabs.com/redisearch/Commands.html#ftsynadd) | N/A | -| [FT.SYNUPDATE](https://oss.redislabs.com/redisearch/Commands.html#ftsynupdate) | N/A | -| [FT.SYNDUMP](https://oss.redislabs.com/redisearch/Commands.html#ftsyndump) | N/A | +| [FT.SYNADD](https://oss.redislabs.com/redisearch/Commands.html#ftsynadd) | [SynAdd](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Client.SynAdd) | +| [FT.SYNUPDATE](https://oss.redislabs.com/redisearch/Commands.html#ftsynupdate) | [SynUpdate](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Client.SynUpdate) | +| [FT.SYNDUMP](https://oss.redislabs.com/redisearch/Commands.html#ftsyndump) | [SynDump](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Client.SynDump) | | [FT.SPELLCHECK](https://oss.redislabs.com/redisearch/Commands.html#ftspellcheck) | [SpellCheck](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Client.SpellCheck) | | [FT.DICTADD](https://oss.redislabs.com/redisearch/Commands.html#ftdictadd) | [DictAdd](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Client.DictAdd) | | [FT.DICTDEL](https://oss.redislabs.com/redisearch/Commands.html#ftdictdel) | [DictDel](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Client.DictDel) |