使用 OpenSearch 的 K-NN 向量搜索来增强搜索功能
很多应用程序的核心竞争力,都建立在能否提供精准且相关的搜索结果上。传统关系数据库的全文搜索功能,在特定场景下确实够用,但一旦遇到要从文本中提取语义含义、或者搜索那些结构化程度较低的数据时,就会显得有些力不从心。今天,我们来聊聊如何用 DigitalOcean 托管的 OpenSearch,再配合一套叫 K-Nearest Neighbor 向量搜索(K-NN)的技术,来突破这些限制。K-NN 让 OpenSearch 成为各种搜索和分析场景中一个灵活又强大的选项,这一点值得深入看看。

理解 K-NN 向量搜索
什么是 K-NN 向量搜索?
传统的搜索方法依赖关键字匹配,而 K-NN 向量搜索走的是另一条路:把数据集里的每条记录都表示成一个
封装
嵌入
为什么用 OpenSearch 做 K-NN 向量搜索?
OpenSearch 简介
OpenSearch 是一款高度可扩展的开源搜索和分析引擎,它在 Elasticsearch 的基础上做了不少增强,能提供强大的全文搜索、日志分析等功能。而向量搜索功能的加入,又让它的触角伸到了更高级的用例里,比如自然语言处理、推荐系统、图像检索等。
用 OpenSearch 做向量搜索的好处
可扩展性:
灵活性:
社区与支持:
设置 OpenSearch 进行 K-NN 向量搜索
安装 OpenSearch
第一步自然是要装上 OpenSearch。下面的命令可以帮你拉取并运行最新版本的 OpenSearch Docker 镜像:
docker pull opensearchproject/opensearch:latest
docker run -d --name opensearch -p 9200:9200 -e "discovery.type=single-node" -e "OPENSEARCH_INITIAL_ADMIN_PASSWORD=" opensearchproject/opensearch:latest
注意:
配置 OpenSearch 进行向量搜索
装好 OpenSearch 之后,下一步是启用 K-NN 插件。如果你是自管理集群,需要修改集群的配置文件。
实现 K-NN 向量搜索
要真正用上 K-NN 向量搜索,得先创建一个带有向量字段的索引。进入 OpenSearch 开发控制台,向 https://{CLUSTER_HOST}:9200 提交下面的请求:
PUT /my_vector_index
{
"mappings": {
"properties": {
"my_vector": {
"type": "knn_vector",
"dimension": 128
}
}
}
}
这个请求创建了索引 my_vector_index,你可以用它来存储和查询 128 维的嵌入向量。接下来,用下面的请求往索引里添加文档和对应的向量表示:
PUT /my_vector_index/_doc/1
{
"my_vector": [0.1, 0.2, ... , 0.128],
"description": "Sample document"
}
最后,要执行 K-NN 搜索,用这个查询即可:
POST /my_vector_index/_search
{
"size": 5,
"query": {
"knn": {
"my_vector": {
"vector": [0.1, 0.2, ... , 0.128],
"k": 5
}
}
}
}
用例和应用
下面来看几个端到端的实际应用场景,看看 OpenSearch 的 K-NN 到底能派上什么用场。
客户支持聊天机器人:
电子商务平台:
时尚零售商:
使用 K-NN 与 OpenSearch 的挑战和注意事项
1. 向量维度
2. 数据规范化
3. 性能调优
结论
K-NN 向量搜索为不同领域提供高度相关的搜索结果打开了新的大门。借助 OpenSearch 的能力,开发者可以相对轻松地实现高级搜索功能——无论是推荐系统、图像检索还是 NLP 应用,OpenSearch 的 K-NN 向量搜索都算得上是搜索技术领域里一件趁手的工具。