ES向量功能实战:向量搜刮(Docker部署ES及可视化ES-Head)

饭宝  金牌会员 | 2024-8-19 21:06:55 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 576|帖子 576|积分 1728

1 缘起

项目需要,向量搜刮使用ES,为了顺利使项目顺利交付,开始学习ES的稠密向量功能,本文即ES向量的实践:增删查改。ES从7.x版本支持向量功能,为测试ES向量功能,需要使用7.x及以上的版本。本文从ES环境搭建开始,完成ES向量功能实践,分享如下。

2 Docker部署ES

2.1 配置ES config

  1. # 打开系统配置文件
  2. vim /etc/sysctl.conf
  3. # 添加修改内容
  4. vm.max_map_count=655360
  5. # 生效
  6. sudo systcl -p
复制代码
2.2 拉取镜像

拉取指定版本ES,如8.12.2,
稠密向量功能是ES在7.x版本之后推出的功能。
  1. docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2
复制代码
2.3 启动ES

  1. docker run -dit \
  2. --restart=always \
  3. --name es01-8-12-2 \
  4. -p 9200:9200 \
  5. -p 9300:9300 \
  6. -v /home/xindaqi/data/es-8-12-2/data:/usr/share/elasticsearch/data \
  7. -v /home/xindaqi/data/es-8-12-2/logs:/usr/share/elasticsearch/logs \
  8. -e ES_JAVA_OPS="-Xms512m -Xmx1g" \
  9. -e discovery.type="single-node" \
  10. -e ELASTIC_PASSWORD="admin-es" \
  11. -m 1GB \
  12. docker.elastic.co/elasticsearch/elasticsearch:8.12.2
复制代码
2.4 测试连接ES



  • cURL
  1. curl --location 'http://localhost:9200
  2. ' \
  3. --header 'Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw=='
复制代码


  • 欣赏器访问:
  1. http://localhost:9200
复制代码
用户名:elastic
暗码:admin-es

2.5 部署ES-Head

2.5.1 拉取镜像&部署

  1. # 拉取镜像
  2. docker pull mobz/elasticsearch-head:5-alpine
复制代码
先启动ES,复制vendor.js文件:
  1. docker run -dit \
  2. --restart=always \
  3. --name es-head \
  4. -p 9100:9100 \
  5. docker.io/mobz/elasticsearch-head:5-alpine
复制代码
  1. # 命令行:复制ES-Head数据到本地
  2. docker cp es-head:/usr/src/app/_site/vendor.js /home/xindaqi/data/es-head/vendor.js
  3. # 修改内容:6886行,替换为:
  4. application/json;charset=UTF-8
  5. # 修改内容:7573行,替换为:
  6. application/json;charset=UTF-8
复制代码
启动ES-Head
  1. # 自动启动
  2. docker run -dit \
  3. --restart=always \
  4. --name es-head \
  5. -p 9100:9100 \
  6. -v /home/xindaqi/data/es-head/vendor.js:/usr/src/app/_site/vendor.js \
  7. docker.io/mobz/elasticsearch-head:5-alpine
复制代码
2.5.2 使用用户名暗码访问ES-head

http://172.22.75.234:9100/?auth_user=elastic&auth_password=admin-es

配置ES:http://172.22.75.234:9200
出现跨域,无法访问.

2.5.3 配置ES

  1. # 命令行
  2. docker cp es01-8-12-2:/usr/share/elasticsearch/config /home/xindaqi/data/es-8-12-2
  3. # 修改ES配置
  4. vi /path/config/elasticsearch.yml
  5. # 配置如下
  6. network.host: 0.0.0.0
  7. http.cors.enabled: true
  8. http.cors.allow-origin: "*"
复制代码
ES重新启动:
  1. docker run -dit \
  2. --restart=always \
  3. --name es01-8-12-2 \
  4. -p 9200:9200 \
  5. -p 9300:9300 \
  6. -v /home/xindaqi/data/es-8-12-2/data:/usr/share/elasticsearch/data \
  7. -v /home/xindaqi/data/es-8-12-2/logs:/usr/share/elasticsearch/logs \
  8. -v /home/xindaqi/data/es-8-12-2/config:/usr/share/elasticsearch/config \
  9. -e ES_JAVA_OPS="-Xms512m -Xmx1g" \
  10. -e discovery.type="single-node" \
  11. -e ELASTIC_PASSWORD="admin-es" \
  12. -m 1GB \
  13. docker.elastic.co/elasticsearch/elasticsearch:8.12.2
复制代码

3 向量使用

ES向量功能使用了新的数据范例:dense_vector,创建索引时,需要指定存储向量属性的范例为dense_vector,同时指定向量维度,固然,创建索引时可以不指定dense_vector范例,ES会主动识别范例,需要注意的是,当向量为低维度数据时,会被识别为float,因此,当使用低维度的数据时,为保险起见,需要在创建索引时指定dense_vector范例。
3.1 新建向量索引

新建向量索引格式:
index-name用户指定的索引名称,用户自界说即可。
  1. http://localhost:9200
  2. /index-name
复制代码
参数:
  1. "field-name":{
  2.     "type":"dense_vector",
  3.     "dims": n
  4. }
复制代码
此中,filed-name为用户设定的属性名称,n为向量维度,其余为固定值。
样例如下:
  1. curl --location --request PUT 'http://localhost:9200
  2. /vector-test' \--header 'Content-Type: application/json' \--header 'Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw==' \--data '{    "mappings": {        "properties": {            "dense_value":{                "type":"dense_vector",                "dims":5            },            "text": {                "type": "text"            },            "uid":{                "type":"keyword"            }        }    }}'
复制代码
3.2 插入向量数据

插入向量数据需要和界说的向量维度雷同,否则插入失败


  • 格式:
  1. http://172.22.75.234:9200/index-name/_doc/id
复制代码
此中,index-name为用户指定的索引名称,id为数据id。


  • 样例如下:
  1. curl --location 'http://172.22.75.234:9200/vector-test/_doc/5' \
  2. --header 'Content-Type: application/json' \
  3. --header 'Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw==' \
  4. --data '{
  5.     "uid": "5",
  6.     "text": "新增的数据5",
  7.     "dense_value": [
  8.         0.6369616873214543,
  9.         0.2697867137638703,
  10.         0.04097352393619469,
  11.         0.016527635528529094,
  12.         0.8132702392002724
  13.     ]
  14. }'
复制代码
更新向量数据



  • 格式:
  1. http://172.22.75.234:9200/index-name/_update/id
复制代码
此中,index-name为用户指定的索引名称,id为数据id。


  • 样例如下:
  1. curl --location 'http://172.22.75.234:9200/vector-test/_update/1' \
  2. --header 'Content-Type: application/json' \
  3. --header 'Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw==' \
  4. --data '{
  5.     "doc": {
  6.         "uid": "1",
  7.         "text": "新增的数据11",
  8.         "dense_value": [
  9.             0.6369616873214543,
  10.             0.2697867137638703,
  11.             0.04097352393619469,
  12.             0.016527635528529094,
  13.             0.8132702392002724
  14.         ]
  15.     }
  16. }'
复制代码
3.3 查询向量数据

3.3.1 相似度查询

相似度查询使用knn,相似度计算使用:cosine


  • 格式:
  1. http://172.22.75.234:9200/index-name/_search
复制代码
此中,index-name为用户指定的索引名称。
  1. {
  2.     "knn":{
  3.         "field":"filed-name",
  4.         "query_vector":[v1, v2, v-dim],
  5.         "k": n,
  6.         "num_candidates": m
  7.     }
复制代码
此中,field-name为用户界说的向量属性,n为查询的前n个相似数据(分数从大->小分列),v1为向量值,维度与界说的索引维度同等,否则会报错,m为候选数据数目(等看了官方文档再更新)。


  • 样例如下:
  1. curl --location 'http://172.22.75.234:9200/vector-test/_search' \
  2. --header 'Content-Type: application/json' \
  3. --header 'Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw==' \
  4. --data '{
  5.     "knn":{
  6.         "field":"dense_value",
  7.         "query_vector":[
  8.                         0.6369616873214543,
  9.                         0.2697867137638703,
  10.                         0.04097352393619469,
  11.                         0.016527635528529094,
  12.                         0.8132702392002724
  13.                     ],
  14.         "k": 3,
  15.         "num_candidates": 100
  16.     },
  17.     "_source":{
  18.         "excludes":["dense_value"],
  19.         "includes":["text", "uid"]
  20.     }
  21. }'
复制代码
3.3.2 条件查询

根据指定条件筛选数据,应用于只使用精准过滤的情况。


  • 格式:
  1. http://172.22.75.234:9200/index-name/_search
复制代码
此中,index-name为用户指定的索引名称,id为数据id。
  1. {
  2.     "query": {
  3.         "bool": {
  4.             "filter": [
  5.                 {
  6.                     "terms": {
  7.                         "field-name": [v1, v2, ..., vn]
  8.                     }
  9.                 }
  10.             ]
  11.         }
  12.     }
  13. }
复制代码
此中,filed-name为用户自界说的属性名称,v1为属性的值。


  • 样例如下:
  1. curl --location 'http://172.22.75.234:9200/vector-test/_search' \
  2. --header 'Content-Type: application/json' \
  3. --header 'Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw==' \
  4. --data '{
  5.     "query": {
  6.         "bool": {
  7.             "filter": [
  8.                 {
  9.                     "terms": {
  10.                         "uid": ["0","1"]
  11.                     }
  12.                 }
  13.             ]
  14.         }
  15.     },
  16.     "_source": {
  17.         "includes": ["text","uid"],
  18.         "excludes": [
  19.             "dense_value"
  20.         ]
  21.     }
  22. }'
复制代码
4 小结

(1)Docker部署ES时通过ELASTIC_PASSWORD配置暗码;
(2)ES7.x之后的版本支持稠密向量功能;
(3)创建使用稠密向量的索引时,需要指定属性范例:dense_vector和向量维度;
(4)向量维度固定后,后续使用向量进行使用(插入数据/插叙数据/更新数据)时必须保持一直,否则报错。
5 Q&A

5.1 ES-Head无法访问ES



  • 缘故原由:
    ES配置了用户名和暗码。
  • 方案:
    使用用户名和暗码访问ES-Head,再配置ES。
    访问ES-Head格式:
  1. http://172.22.75.234:9100/?auth_user=elastic&auth_password=admin-es
复制代码
在ES-Head中配置ES即可。

5.2 ES-Head无法查询数据

{
“error”: “Content-Type header [application/x-www-form-urlencoded] is not supported”,
“status”: 406
}



  • 缘故原由
    ES8对请求头限制。
  • 方案
    修改vendor.js
  1. # 命令行:复制ES-Head数据到本地
  2. docker cp es-head:/usr/src/app/_site/vendor.js /home/xindaqi/data/es-head/vendor.js
  3. # 修改内容:6886行,替换为:
  4. application/json;charset=UTF-8
  5. # 修改内容:7573行,替换为:
  6. application/json;charset=UTF-8
复制代码
启动ES-Head
  1. # 自动启动
  2. docker run -dit \
  3. --restart=always \
  4. --name es-head \
  5. -p 9100:9100 \
  6. -v /home/xindaqi/data/es-head/vendor.js:/usr/src/app/_site/vendor.js \
  7. docker.io/mobz/elasticsearch-head:5-alpine
复制代码


解决:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表