# Go client for Manticore Search

В этом руководстве мы изучим, как использовать Go‑SDK, официальный Go‑клиент для Manticore Search.

Если вы хотите пройти интерактивный курс, перейдите [сюда](https://play.manticoresearch.com/go-sdk/).

# Установка

---

Сначала убедимся, что на машине запущен экземпляр Manticore. (Если вам нужен курс по установке Manticore Search для определённой ОС, такой как Debian, CentOS, Ubuntu и т.д., вы можете найти его на нашей [платформе интерактивных курсов](https://play.manticoresearch.com/) )

`searchd --status`

```bash
root@go-sdk-75b6444c5b-n6ph9:/# searchd --status
Manticore 3.1.0 445e806e@190716 release
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
Copyright (c) 2017-2019, Manticore Software LTD (http://manticoresearch.com)

using config file '/etc/sphinxsearch/sphinx.conf'...

searchd status
--------------
uptime: 3569
connections: 1
maxed_out: 0
version: 3.1.0 445e806e@190716 release
mysql_version: 5.5.21
command_search: 0
command_excerpt: 0
command_update: 0
command_delete: 0
command_keywords: 0
command_persist: 0
command_status: 1
command_flushattrs: 0
command_set: 0
command_insert: 0
command_replace: 0
command_commit: 0
command_suggest: 0
command_json: 0
command_callpq: 0
agent_connect: 0
agent_retry: 0
queries: 0
dist_queries: 0
workers_total: 30
workers_active: 1
work_queue_length: 1
query_wall: 0.000
query_cpu: OFF
dist_wall: 0.000
dist_local: 0.000
dist_wait: 0.000
query_reads: OFF
query_readkb: OFF
query_readtime: OFF
avg_query_wall: 0.000
avg_query_cpu: OFF
avg_dist_wall: 0.000
avg_dist_local: 0.000
avg_dist_wait: 0.000
avg_query_reads: OFF
avg_query_readkb: OFF
avg_query_readtime: OFF
qcache_max_bytes: 16777216
qcache_thresh_msec: 3000
qcache_ttl_sec: 60
qcache_cached_queries: 0
qcache_used_bytes: 0
qcache_hits: 0

```
Теперь мы можем установить Go‑SDK с помощью следующей команды:

`go get github.com/manticoresoftware/go-sdk/manticore`

```bash
root@go-sdk-75b6444c5b-n6ph9:/# go get github.com/manticoresoftware/go-sddk/manticore

```

# Базовое использование

---


Давайте посмотрим на этот простой Go‑скрипт:

`cat manticore.go`


```bash
root@go-sdk-75b6444c5b-n6ph9:/# cat manticore.go
package main

import "github.com/manticoresoftware/go-sdk/manticore"
import "fmt"

func main() {
cl := manticore.NewClient()
cl.SetServer("127.0.0.1", 9312)
cl.Open()
res, err := cl.Sphinxql(`replace into testrt values(1,'my subject', 'my content', 15)`)
fmt.Println(res, err)
res, err = cl.Sphinxql(`replace into testrt values(2,'another subject', 'more content', 15)`)
fmt.Println(res, err)
res, err = cl.Sphinxql(`replace into testrt values(5,'again subject', 'one more content', 10)`)
fmt.Println(res, err)
res2, err2 := cl.Query("more|another", "testrt")
fmt.Println(res2, err2)

```

Скрипт создаёт новый клиент Manticore, выполняет простые INSERT‑запросы к индексу **testrt** и затем делает запрос для добавленного контента.

Запустим его:

`go run manticore.go`

```bash
root@go-sdk-75b6444c5b-n6ph9:/# go run manticore.go
[Query OK, 1 rows affected]
[Query OK, 1 rows affected]
[Query OK, 1 rows affected]
Status: ok
Query time: 0s
Total: 1
Total found: 1
Schema:
Fields:
title
content
Attributes:
gid: int
Matches:
Doc: 2, Weight: 2, attrs: [15]
Word stats:
'more' (Docs:2, Hits:2)
'another' (Docs:1, Hits:1)

```

Как видим, новые документы были успешно добавлены в индекс, и два документа, содержащие слова **more** или **another**, были найдены запросом.


# Ещё несколько примеров

---


С помощью Go‑SDK вы можете легко фильтровать результаты запросов по атрибутам индекса

`cat manticore2.go`


```bash
root@go-sdk-75b6444c5b-n6ph9:/# cat manticore2.go
package main

import "github.com/manticoresoftware/go-sdk/manticore"
import "fmt"

func main() {
cl := manticore.NewClient()
cl.SetServer("127.0.0.1", 9312)
cl.Open()
res, err := cl.Sphinxql(`replace into testrt values(1,'my subject', 'my content', 15)`)
fmt.Println(res, err)
res, err = cl.Sphinxql(`replace into testrt values(2,'another subject', 'more content', 15)`)
fmt.Println(res, err)
res, err = cl.Sphinxql(`replace into testrt values(5,'again subject', 'one more content', 10)`)
fmt.Println(res, err)


q := manticore.NewSearch("content", "testrt", "")
res2, err2 := cl.RunQuery(q)
fmt.Println(res2, err2)

attrValues := []int64{10}
q.AddFilter("gid", attrValues, false)
res2, err2 = cl.RunQuery(q)
fmt.Println(res2, err2)

```
Этот скрипт создаёт новый клиент Manticore, выполняет простые INSERT‑запросы к индексу **testrt** и затем делает два запроса, ищущих слово **content**. Первый запрос возвращает все документы, так как все документы в индексе теперь содержат это слово. Второй запрос использует созданный нами фильтр и возвращает только документы, содержащие слово **content** и имеющие атрибут **gid**, равный 10. В нашем случае существует лишь один документ, удовлетворяющий этим условиям, с **id=10**.

`go run manticore2.go`


```bash
root@go-sdk-75b6444c5b-n6ph9:/# go run manticore2.go
[Query OK, 1 rows affected]
[Query OK, 1 rows affected]
[Query OK, 1 rows affected]
Status: ok
Query time: 0s
Total: 3
Total found: 3
Schema:
Fields:
title
content
Attributes:
gid: int
Matches:
Doc: 1, Weight: 1, attrs: [15]
Doc: 2, Weight: 1, attrs: [15]
Doc: 5, Weight: 1, attrs: [10]
Word stats:
'content' (Docs:3, Hits:3)

Status: ok
Query time: 0s
Total: 1
Total found: 1
Schema:
Fields:
title
content
Attributes:
gid: int
Matches:
Doc: 5, Weight: 1, attrs: [10]
Word stats:
'content' (Docs:3, Hits:3)

```
Вы также можете использовать выражение, похожее на SQL, для фильтрации.

`cat manticore3.go`


```bash
root@go-sdk-75b6444c5b-n6ph9:/# cat manticore3.go
package main

import "github.com/manticoresoftware/go-sdk/manticore"
import "fmt"

func main() {
cl := manticore.NewClient()
cl.SetServer("127.0.0.1", 9312)
cl.Open()
res, err := cl.Sphinxql(`replace into testrt values(1,'my subject', 'my content', 15)`)
fmt.Println(res, err)
res, err = cl.Sphinxql(`replace into testrt values(2,'another subject', 'more content', 15)`)
fmt.Println(res, err)
res, err = cl.Sphinxql(`replace into testrt values(5,'again subject', 'one more content', 10)`)
fmt.Println(res, err)


q := manticore.NewSearch("content", "testrt", "")
res2, err2 := cl.RunQuery(q)
fmt.Println(res2, err2)

q.AddFilterExpression("gid > 10 AND gid < 20" , false)
res2, err2 = cl.RunQuery(q)
fmt.Println(res2, err2)

```
Здесь мы используем выражение `gid > 10 AND gid < 20` для фильтрации результата запроса. Как и в предыдущем примере, первый запрос возвращает все документы из индекса, а второй — только документы с `gid=15`.

`go run manticore3.go`

```bash
}root@go-sdk-75b6444c5b-n6ph9:/# go run manticore3.go
[Query OK, 1 rows affected]
[Query OK, 1 rows affected]
[Query OK, 1 rows affected]
Status: ok
Query time: 0s
Total: 3
Total found: 3
Schema:
Fields:
title
content
Attributes:
gid: int
Matches:
Doc: 1, Weight: 1, attrs: [15]
Doc: 2, Weight: 1, attrs: [15]
Doc: 5, Weight: 1, attrs: [10]
Word stats:
'content' (Docs:3, Hits:3)

Status: ok
Query time: 5ms
Total: 2
Total found: 2
Schema:
Fields:
title
content
Attributes:
gid: int
Matches:
Doc: 1, Weight: 1, attrs: [15]
Doc: 2, Weight: 1, attrs: [15]
Word stats:
'content' (Docs:3, Hits:3)

```
Более полную информацию о подключении к Manticore вы можете найти [здесь](https://manual.manticoresearch.com/Connecting_to_the_server).

Документацию Manticore GO‑SDK можно найти [здесь](https://godoc.org/github.com/manticoresoftware/go-sdk/manticore).
