Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added example to demonstrate use georadius. #104

Merged
merged 5 commits into from
Apr 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,7 @@
!/tests/*.bz2
!Makefile
!**/*.yml

# IDEs
.idea
.vscode
7 changes: 7 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ GOTEST=$(GOCMD) test -count=1
GOGET=$(GOCMD) get
GOMOD=$(GOCMD) mod
GOFMT=$(GOCMD) fmt
GODOC=godoc

.PHONY: all test coverage
all: test coverage examples
Expand All @@ -34,6 +35,7 @@ examples: get
@echo "Building the examples..."
$(GOBUILD) ./examples/redisearch_quickstart/.
$(GOBUILD) ./examples/redisearch_auth/.
$(GOBUILD) ./examples/redisearch_geo/.
$(GOBUILD) ./examples/redisearch_tls_client/.
$(GOBUILD) ./examples/redisearch_temporary_index/.
./redisearch_tls_client --tls-cert-file $(TLS_CERT) \
Expand All @@ -53,3 +55,8 @@ test: get fmt
coverage: get
$(GOTEST) -race -coverprofile=coverage.txt -covermode=atomic ./redisearch

godoc:
$(GOGET) -u golang.org/x/tools/...
echo "Open browser tab on localhost:6060"
$(GODOC)

85 changes: 85 additions & 0 deletions examples/redisearch_geo/redisearch_geo.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package main

import (
"fmt"
"github.com/RediSearch/redisearch-go/redisearch"
"log"
)

/**
* This example maps to https://redis.io/commands/geoadd#examples of Georadius search
* This demo should be updated in RediSearch.io if changed
* Update at: https://github.com/RediSearch/RediSearch/blob/master/docs/go_client.md
*/
func main() {
// Create a client. By default a client is schemaless
// unless a schema is provided when creating the index
c := redisearch.NewClient("localhost:6379", "cityIndex")

// Create a schema
sc := redisearch.NewSchema(redisearch.DefaultOptions).
AddField(redisearch.NewTextField("city")).
AddField(redisearch.NewGeoField("location"))

// Drop an existing index. If the index does not exist an error is returned
c.Drop()

// Create the index with the given schema
if err := c.CreateIndex(sc); err != nil {
log.Fatal(err)
}

// Create the city docs
// Note While Specifying location you should specify in following order -> longitude,latitude
// Same look and feel as GEOADD https://redis.io/commands/geoadd
// This example maps to https://redis.io/commands/geoadd#examples
docPalermo := redisearch.NewDocument("doc:Palermo", 1.0)
docPalermo.Set("name", "Palermo").
Set("location", "13.361389,38.115556")

docCatania := redisearch.NewDocument("doc:Catania", 1.0)
docCatania.Set("name", "Catania").
Set("location", "15.087269,37.502669")

// Index the documents. The API accepts multiple documents at a time
if err := c.IndexOptions(redisearch.DefaultIndexingOptions, docPalermo, docCatania); err != nil {
log.Fatal(err)
}

// Searching for 100KM radius should only output Catania
docs, _, _ := c.Search(redisearch.NewQuery("*").AddFilter(
redisearch.Filter{
Field: "location",
Options: redisearch.GeoFilterOptions{
Lon: 15,
Lat: 37,
Radius: 100,
Unit: redisearch.KILOMETERS,
},
},
).Limit(0, 2))

fmt.Println("100KM Radius search from longitude 15 latitude 37")
fmt.Println(docs[0])
// Output: 100KM Radius search from longitude 15 latitude 37
// Output: {doc:Catania 1 [] map[location:15.087269,37.502669 name:Catania]}

// Searching for 200KM radius should output Catania and Palermo
docs, _, _ = c.Search(redisearch.NewQuery("*").AddFilter(
redisearch.Filter{
Field: "location",
Options: redisearch.GeoFilterOptions{
Lon: 15,
Lat: 37,
Radius: 200,
Unit: redisearch.KILOMETERS,
},
},
).Limit(0, 2).SetSortBy("location", true))
fmt.Println("200KM Radius search from longitude 15 latitude 37")
fmt.Println(docs[0])
fmt.Println(docs[1])
// Output: 100KM Radius search from longitude 15 latitude 37
// Output: {doc:Palermo 1 [] map[location:13.361389,38.115556 name:Palermo]}
// Output: {doc:Catania 1 [] map[location:15.087269,37.502669 name:Catania]}
}
6 changes: 6 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,10 @@ go 1.12
require (
github.com/gomodule/redigo v1.8.3
github.com/stretchr/testify v1.6.1
github.com/yuin/goldmark v1.3.5 // indirect
golang.org/x/mod v0.4.2 // indirect
golang.org/x/net v0.0.0-20210421230115-4e50805a0758 // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/sys v0.0.0-20210421221651-33663a62ff08 // indirect
golang.org/x/tools v0.1.0 // indirect
)
43 changes: 43 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,55 @@ github.com/gomodule/redigo v1.8.3 h1:HR0kYDX2RJZvAup8CsiJwxB4dTCSC0AaUq6S4SiLwUc
github.com/gomodule/redigo v1.8.3/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5 h1:dPmz1Snjq0kmkz159iL7S6WzdahUTHnHB5M56WFVifs=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210421230115-4e50805a0758 h1:aEpZnXcAmXkd6AvLb2OPt+EN1Zu/8Ne3pCqPjja5PXY=
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210421221651-33663a62ff08 h1:qyN5bV+96OX8pL78eXDuz6YlDPzCYgdW74H5yE9BoSU=
golang.org/x/sys v0.0.0-20210421221651-33663a62ff08/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
80 changes: 80 additions & 0 deletions redisearch/example_client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,86 @@ func ExampleNewClientFromPool_ssl() {
c.Drop()
}

// The following example illustrates geospatial search using RediSearch.
// This examples maps to the Redis vanilla example showcased on https://redis.io/commands/georadius#examples.
// We'll start by adding two docs ( one for each city ) and then do a georadius search based on a starting point
// and 2 distinct radius:
// 1)- First query with 100KM radius centered at long,lat 15,37 that should only output the city named "Catania";
// 2)- Second query with 200KM radius centered at long,lat 15,37 that should output the cities named "Palermo" and "Catania";
func ExampleClient_Search() {
// Create a client. By default a client is schemaless
// unless a schema is provided when creating the index
c := redisearch.NewClient("localhost:6379", "cityIndex")

// Create a schema
sc := redisearch.NewSchema(redisearch.DefaultOptions).
AddField(redisearch.NewTextField("city")).
AddField(redisearch.NewGeoField("location"))

// Drop an existing index. If the index does not exist an error is returned
c.Drop()

// Create the index with the given schema
if err := c.CreateIndex(sc); err != nil {
log.Fatal(err)
}

// Create the city docs
// Note While Specifying location you should specify in following order -> longitude,latitude
// Same look and feel as GEOADD https://redis.io/commands/geoadd
// This example maps to https://redis.io/commands/geoadd#examples
docPalermo := redisearch.NewDocument("doc:Palermo", 1.0)
docPalermo.Set("name", "Palermo").
Set("location", "13.361389,38.115556")

docCatania := redisearch.NewDocument("doc:Catania", 1.0)
docCatania.Set("name", "Catania").
Set("location", "15.087269,37.502669")

// Index the documents. The API accepts multiple documents at a time
if err := c.IndexOptions(redisearch.DefaultIndexingOptions, docPalermo, docCatania); err != nil {
log.Fatal(err)
}

// Searching for 100KM radius should only output Catania
docs, _, _ := c.Search(redisearch.NewQuery("*").AddFilter(
redisearch.Filter{
Field: "location",
Options: redisearch.GeoFilterOptions{
Lon: 15,
Lat: 37,
Radius: 100,
Unit: redisearch.KILOMETERS,
},
},
).Limit(0, 2))

fmt.Println("100KM Radius search from longitude 15 latitude 37")
fmt.Println(docs[0])

// Searching for 200KM radius should output Catania and Palermo
docs, _, _ = c.Search(redisearch.NewQuery("*").AddFilter(
redisearch.Filter{
Field: "location",
Options: redisearch.GeoFilterOptions{
Lon: 15,
Lat: 37,
Radius: 200,
Unit: redisearch.KILOMETERS,
},
},
).Limit(0, 2).SetSortBy("location", true))
fmt.Println("200KM Radius search from longitude 15 latitude 37")
fmt.Println(docs[0])
fmt.Println(docs[1])

// Output: 100KM Radius search from longitude 15 latitude 37
// {doc:Catania 1 [] map[location:15.087269,37.502669 name:Catania]}
// 200KM Radius search from longitude 15 latitude 37
// {doc:Palermo 1 [] map[location:13.361389,38.115556 name:Palermo]}
// {doc:Catania 1 [] map[location:15.087269,37.502669 name:Catania]}
}

func getConnectionDetails() (host string, password string) {
value, exists := os.LookupEnv("REDISEARCH_TEST_HOST")
host = "localhost:6379"
Expand Down