尽管在映射中设置了 [ERROR] 'The [dims] property must be specified for field [vector].'

getting [ERROR] 'The [dims] property must be specified for field [vector].' despite being set in mapping

我正在尝试将密集向量上传到 Elasticsearch 端点。

  1. 已创建索引,映射如下:
        mapping = {
        "mappings": {
            "properties" : {
                "vector": {
                    "type": "dense_vector",
                    "dims": 300  
                    },
                "word" : {
                    "type" : "text"
                    }
                }
            }
        }  

        es.indices.create(
        index="test",
        body=mapping
    ) 

收到回复:

{'acknowledged': True, 'shards_acknowledged': True, 'index': 'test'}
  1. 创建了一个使用批量 api 上传矢量的函数,如下所示: 模型是一个 python 字典,其中词作为键,关联向量作为值。
def gendata(model):
  for key, value in model.items():
    key = str(key)
    yield {
        "_index": "test",
        "_id": key,
        "_type": "document",
        "word": key,
        "vector": value
    }

使用 helpers.bulk()

调用函数 gendata() 时出现以下错误

注意:dims 是在映射中设置的,那么为什么它给出必须指定 dims 的错误。

BulkIndexError: ('100 document(s) failed to index.', [{'index': {'_index': 'test', '_type': 'document', '_id': 'the', 'status': 400, 'error': {'type': 'mapper_parsing_exception', 'reason': 'The [dims] property must be specified for field [vector].'}, 'data': {'word': 'the', 'vector': [0.04656, 0.21318, -0.0074364, -0.45854, -0.035639, 0.23643, -0.28836, 0.21521, -0.13486, -1.6413, -0.26091, 0.032434, 0.056621, -0.043296, -0.021672, 0.22476, -0.075129, -0.067018, -0.14247, 0.038825, -0.18951, 0.29977, 0.39305, 0.17887, -0.17343, -0.21178, 0.23617, -0.063681, -0.42318, -0.11661, 0.093754, 0.17296, -0.33073, 0.49112, -0.68995, -0.092462, 0.24742, -0.17991, 0.097908, 0.083118, 0.15299, -0.27276, -0.038934, 0.54453, 0.53737, 0.29105, -0.0073514, 0.04788, -0.4076, -0.026759, 0.17919, 0.010977,

Elasticsearch 在查询期间不会读取您的映射配置,因为您使用的 ES 7.x 不再支持 doc_type -doc here - 但您指定了这个bulk 查询中的参数。根据 mapping 变量,当您创建索引时,您没有指定 doc_type,但是当您执行批量请求时,您使用的是不存在的 doc_type - document.

所以请更改:

def gendata(model):
  for key, value in model.items():
    key = str(key)
    yield {
        "_index": "test",
        "_id": key,
        "_type": "document",
        "word": key,
        "vector": value
    }

在:

def gendata(model):
  for key, value in model.items():
    key = str(key)
    yield {
        "_index": "test",
        "_id": key,
        "word": key,
        "vector": value
    }