引自免费微信小程序:皆我百晓生
在Elasticsearch 7.14中,向量检索支持多种类型的向量数据,包括DENSE_VECTOR、SparseFloatVector和SPARSE_LONG_VECTOR。如果你想要使用非DENSE_VECTOR类型,比如SparseFloatVector,你需要确保你的映射配置正确,并且在索引文档时提供正确的向量格式。
首先,让我们定义一个包含SparseFloatVector字段的映射。在这个例子中,我们创建一个名为my_index的索引,并设置一个名为vector_field的SparseFloatVector字段:
from elasticsearch import Elasticsearch, helpers
# 连接Elasticsearch实例
es = Elasticsearch()
# 定义映射
mapping = {
"mappings": {
"properties": {
"vector_field": {
"type": "dense_vector",
"dimension": 50,
"params": {
"format": "SPARSE"
}
}
}
}
}
# 创建索引并应用映射
if not es.indices.exists(index="my_index"):
es.indices.create(index="my_index", body=mapping)
# 示例向量数据
vector_data = [[0.1, 0.2, 0.3, 0.4, 0.5], [0.6, 0.7, 0.8, 0.9, 1.0]]
# 索引文档
def index_document(vector):
return {
"_index": "my_index",
"_source": {
"vector_field": vector
}
}
actions = (index_document(vec) for vec in vector_data)
helpers.bulk(es, actions)
# 搜索示例
query = {
"script_score": {
"query": {"match_all": {}},
"script": {
"source": """
double dot_product = script_fields['vector_field'].dotProduct(params.query_vector);
return dot_product;
""",
"params": {
"query_vector": [0.2, 0.3, 0.4, 0.5, 0.6]
},
"lang": "painless"
}
}
}
response = es.search(index="my_index", body=query)
这段代码首先连接到Elasticsearch实例,然后定义了一个名为my_index的索引及其映射,其中vector_field是一个SparseFloatVector类型。接下来,我们索引了两个示例向量数据。最后,我们执行了一个基于向量相似度的搜索查询。
注意,这里使用的params.query_vector是你希望与索引中的向量进行比较的查询向量。这个查询将返回最接近给定查询向量的文档,并根据它们之间的余弦相似度进行排序。
如果你遇到任何问题,或者需要进一步的帮助,请随时告诉我。
