gpt4 book ai didi

python - 在 Elasticsearch 中添加稀疏向量作为字段

转载 作者:太空宇宙 更新时间:2023-11-04 04:04:29 24 4
gpt4 key购买 nike

最近,Elasticsearch 允许在查询中使用向量和稀疏向量。正在关注their documentation ,我遇到了一个错误(参见 full details on this question ),本质上:

"type" : "illegal_argument_exception",
"reason" : "Variable [embedding] is not defined."

“嵌入”似乎不是一个成功的领域。

我正在将我的文档上传到 Elasticsearch,如下所示:

  1. 我为每个文档创建一个 json 文件
  2. 我在 Python 中加载 json 文件 db_object = json.load(fp)
  3. 我将这些对象传递给 Elasticsearch:es.index(index=my_index, doc_type='sentence', id=db_object['name'], body=db_object)

这是我的 json 文件的结构(请注意,嵌入是一个字典,因为它是一个稀疏向量)。

{"name": "doc_name", "field_1": "doc_id", "field_2": "a_keyword", "text": "a rather long text", "embedding": {"4655": 0.040158602078116556, "4640": 0.040158602078116556}}

但是,如果我进行简单的测试查询,嵌入似乎不起作用。采用此查询结构:

curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"query_string" : {
"query" : "0.040158602078116556",
"default_field" : "embedding"
}
}
}'

如果我将 embedding 留在“default_field”中,则找不到任何文档。

如果我尝试将 4655 作为字段(请注意,这是与我在查询中粘贴的数字相对应的嵌入字典中的键)也没有任何反应。

但是,如果该字段是 embedding.4655,则查询有效。对我来说,这似乎是一个明显的迹象,表明“嵌入”不被理解为作为稀疏向量的单个字段,而是字典键与“嵌入”结合形成具有数值的独立字段的集合。

另一个可能不对的提示是,像这样加载文档会使 Elasticsearch 抗议字段太多,而我原以为“嵌入”是一个且只有一个字段。

我说的对吗?我上传有关该专业的文件的方式是否存在缺陷?

最佳答案

问题是 Elasticsearch 无法推断出正确的类型。它认为字典中的每个键都是一个新字段(embedding.key)。所以我们需要提供一个指定类型的映射。在我的例子中,在创建索引后,在 Python 中使用 elasticsearch 库:

import requests

uri='http://localhost:9200/my_index/_mapping'

json_body="""{
"properties": {
"name": {
"type": "keyword"
},
"reference": {
"type": "keyword"
},
"jurisdiction": {
"type": "keyword"
},
"text": {
"type": "text"
},
"embedding": {
"type": "sparse_vector"
}
}
}""")

headers = {
'Content-Type': 'application/json',
}

requests.put(uri, headers=headers, data=json_body)

关于python - 在 Elasticsearch 中添加稀疏向量作为字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57611631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com