elasticsearch Get RequestError(400,'search_phase_execution_exception','runtime error')for cossimilarity

68bkxrlz  于 2023-06-21  发布在  ElasticSearch
关注(0)|答案(3)|浏览(354)

我尝试使用tensorflow_hub使用Elasticsearch进行语义搜索,但得到了RequestError: RequestError(400, 'search_phase_execution_exception', 'runtime error')。根据search_phase_execution_exception,我假设数据已损坏(from this stack question)我的文档结构如下所示

{
"settings": {
  "number_of_shards": 2,
  "number_of_replicas": 1
},
 "mappings": {
  "dynamic": "true",
  "_source": {
    "enabled": "true"
  },
  "properties": {
        "id": {
            "type":"keyword"
        },
        "title": {
            "type": "text"
        },
        "abstract": {
            "type": "text"
        },
        "abs_emb": {
            "type":"dense_vector",
            "dims":512
        },
        "timestamp": {
            "type":"date"
        }
    }
}
}

我使用elasticsearch.indices.create创建了一个文档。

es.indices.create(index=index, body='my_document_structure')
res = es.indices.delete(index=index, ignore=[404])
for i in range(100):
  doc = {
    'timestamp': datetime.datetime.utcnow(),
    'id':id[i],
    'title':title[0][i],
    'abstract':abstract[0][i],
    'abs_emb':tf_hub_KerasLayer([abstract[0][i]])[0]
  }
  res = es.index(index=index, body=doc)

对于我的语义搜索,我使用以下代码
query =“graphene”query_vector = list(embed([query])[0])

script_query = {
    "script_score": {
        "query": {"match_all": {}},
        "script": {
            "source": "cosineSimilarity(params.query_vector, doc['abs_emb']) + 1.0",
            "params": {"query_vector": query_vector}
        }
    }
}

response = es.search(
    index=index,
    body={
        "size": 5,
        "query": script_query,
        "_source": {"includes": ["title", "abstract"]}
    }
)

我知道在stackoverflow和elsasticsearch中有一些类似的问题,但我找不到适合我的解决方案。我的猜测是文档结构是错误的,但我不能弄清楚到底是什么。我使用了来自this repo的搜索查询代码。完整的错误消息太长,似乎没有包含太多信息,所以我只分享最后一部分。

~/untitled/elastic/venv/lib/python3.9/site-packages/elasticsearch/connection/base.py in 
_raise_error(self, status_code, raw_data)
320             logger.warning("Undecodable raw error response from server: %s", err)
321 
--> 322         raise HTTP_EXCEPTIONS.get(status_code, TransportError)(
323             status_code, error_message, additional_info
324         )

RequestError: RequestError(400, 'search_phase_execution_exception', 'runtime error')

这里是Elasticsearch服务器的错误。

[2021-04-29T12:43:07,797][WARN ][o.e.c.r.a.DiskThresholdMonitor] 
[asmac.local] high disk watermark [90%] exceeded on 
[w7lUacguTZWH9xc_lyd0kg][asmac.local][/Users/username/elasticsearch- 
7.12.0/data/nodes/0] free: 17.2gb[7.4%], shards will be relocated 
away from this node; currently relocating away shards totalling [0] 
bytes; the node is expected to continue to exceed the high disk 
watermark when these relocations are complete
r6vfmomb

r6vfmomb1#

我认为你遇到了以下问题,你应该更新你的查询:

script_query = {
    "script_score": {
        "query": {"match_all": {}},
        "script": {
            "source": "cosineSimilarity(params.query_vector, 'abs_emb') + 1.0",
            "params": {"query_vector": query_vector}
        }
    }
}

还要确保query_vector包含浮点数而不是双精度数

qpgpyjmq

qpgpyjmq2#

在我的例子中,错误是“由以下原因引起:java.lang.ClassCastException:class org.elasticsearch.index.fielddata.ScriptDocValues$Doubles无法强制转换为class org.elasticsearch.xpack.vect ors.query.VectorScriptDocValues$DenseVectorScriptDocValues”
我的错误是-我在开始摄取内容之前删除了ES索引。有“type”的那个:“dense_vector”字段。
这导致ES没有使用正确的类型来索引密集向量:它们被存储为无用的双精度列表。在这个意义上,ES索引被“损坏”:所有'script_score'查询返回400。

w46czmvw

w46czmvw3#

对我来说,问题是我使用的是dense_vector而不是elastiknn_dense_float_vector,这仍然是一个悬而未决的问题。我正在将我的向量索引转换为使用dense_vectorhttps://github.com/alexklibisz/elastiknn/issues/323

相关问题