qq_34192377 2024-05-29 14:15 采纳率: 0%
浏览 36

请教下Elasticsearch7.14向量检索

你好 我看您写的Easy-Es对Elasticsearch7.14向量检索,原生脚本写法这篇文章,我使用easy-es创建向量的时候,类型不是DENSE_VECTOR

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-29 14:15
    关注

    引自免费微信小程序:皆我百晓生

    在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是你希望与索引中的向量进行比较的查询向量。这个查询将返回最接近给定查询向量的文档,并根据它们之间的余弦相似度进行排序。

    如果你遇到任何问题,或者需要进一步的帮助,请随时告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月29日