携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
Solr是基于Lucene开发的搜索引擎,在Lucene的基础上封装了更多新的搜索特性,用户可以通过Http的方式新增修改或查询Solr中的数据,同时还提供了可视化的操作界面,用户可以通过后台界面管理Solr中的数据,大大降低了入门的门槛。本文将从以下几点出发,阐述如何安装和使用Solr:
-
基于Docker安装Solr
-
基于Web页面操作Solr
-
基于Golang操作Solr中的数据
安装
使用Docker一键安装并启动Solr,启动后访问地址http://127.0.0.1:8983,如果能正常响应Solr的网页数据,说明Solr安装成功了。
docker run -d -p 8983:8983 --name some-solr -t solr
基于Web页面操作Solr
创建Core
在Core Admin中创建需要操作的Core(可以将Core理解为数据库中的表),不过在创建之前需要参考以下命令先进入到容器中复制一个默认配置到/var/solr中
# 进入刚创建的容器
docker exec -it some-solr /bin/bash
# 这里根据版本(solr-9.0.0)选择自己安装版本的配置文件
cp -r /opt/solr-9.0.0/server/solr/configsets/_default/conf /var/solr/data/new_core
新增文档
选中new_core这个Core后点击Documents,按照下图所示的提示即可新增一个文档
删除文档
通过delete标签表示要进行删除操作,通过id标签指定需要删除数据的id
查询文档
在Query中可对文档进行查询,通过q指定查询的条件
基于Golang操作Solr中的数据
因为Solr提供的服务是基于http进行管理的,所以当我们确认好自己的Core后即可拿到需要操作的数据的完整地址,通过请求该地址的时候带上特定的参数即可实现对Solr数据的管理
- 新增文档
url := "http://127.0.0.1:8983/solr/new_core/update?_=1659706836648&commitWithin=1000&overwrite=true&wt=json"
// 组装需要发送的数据
data := []map[string]interface{}{
{"title": "Hello"},
}
marshal, _ := json.Marshal(data)
// 拼接请求对象
req, _ := http.NewRequest("POST", url, bytes.NewReader(marshal))
req.Header.Set("Content-type", "application/json")
client := http.Client{}
// 发送数据
resp, _ := client.Do(req)
defer resp.Body.Close()
// 处理响应
respBytes, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(respBytes))
- 删除文档
url := "http://127.0.0.1:8983/solr/new_core/update?_=1659706836648&commitWithin=1000&overwrite=true&wt=json"
// 拼接发送的数据
req, _ := http.NewRequest("POST", url, bytes.NewReader([]byte(`<add><delete><id>17081d52-0d8f-42e3-abdd-eb50bf159b67</id></delete></add>`)))
req.Header.Set("Content-type", "text/xml")
client := http.Client{}
// 发送数据
resp, _ := client.Do(req)
defer resp.Body.Close()
// 处理响应
respBytes, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(respBytes))
- 查询文档
// 请求地址
// 在q这个参数中指定查询条件
url := "http://127.0.0.1:8983/solr/new_core/select?_=1659708339579&indent=true&q=*:*&q.op=OR"
resp, _ := http.Get(url)
defer resp.Body.Close()
respBytes, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(respBytes))