天堂上的寂寞 2024-06-17 18:03 采纳率: 33.3%
浏览 30

elasticsearch 使用cosineSimilarity后报错,如何解决?

**elasticsearch 使用cosineSimilarity后报错 **

Traceback (most recent call last):
  File "D:\AI\infinitus-devops-cskms-cskms-aisearch-\infinitus-devops-cskms-cskms-aisearch-\elastic\test\testSql.py", line 1670, in <module>
    response = es.search(index="long_title", body=query)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "d:\anaconda3\Lib\site-packages\elasticsearch\_sync\client\utils.py", line 446, in wrapped
    return api(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^
  File "d:\anaconda3\Lib\site-packages\elasticsearch\_sync\client\__init__.py", line 3836, in search
    return self.perform_request(  # type: ignore[return-value]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "d:\anaconda3\Lib\site-packages\elasticsearch\_sync\client\_base.py", line 320, in perform_request
    raise HTTP_EXCEPTIONS.get(meta.status, ApiError)(
elasticsearch.BadRequestError: BadRequestError(400, 'search_phase_execution_exception', 'runtime error')

导致报错,删除后正常,但我不想删除该函数

img

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-17 18:03
    关注

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

    遇到在Elasticsearch中使用cosineSimilarity函数时出现错误的情况,通常与脚本执行、参数设置或索引映射不匹配有关。从提供的信息来看,错误信息表明存在一个运行时错误(runtime error)。这可能是因为在你的查询中某些部分没有被正确配置。

    解决方案

    步骤1:检查脚本语法

    首先,确认脚本语法是否正确。在你提供的脚本中,缺少了一个逗号分隔sourceparams字段。正确的脚本结构应该像这样:

    {
      "script_score": {
        "query": {
          "match_all": {}
        },
        "script": {
          "source": "cosineSimilarity(params.query_vector, params.field) + 1.0",
          "params": {
            "query_vector": [0.144, 0.555, 0.888],
            "field": "vector_field" // 这里应该是你索引中的向量字段名
          }
        }
      }
    }
    

    注意,在params中,field应该指向索引中的实际向量字段名称,而不是一个数组值。

    步骤2:确保向量字段正确映射

    确保你的索引映射中包含正确的向量字段,并且这个字段是按照Elasticsearch对向量数据的支持方式定义的。例如,你的映射可能看起来像这样:

    PUT long_title
    {
      "mappings": {
        "properties": {
          "vector_field": {
            "type": "dense_vector",
            "dims": 3 // 这里的维度应该与你的向量长度一致
          }
        }
      }
    }
    

    步骤3:检查向量字段数据类型一致性

    确认在索引中的所有文档,其vector_field的值都是与query_vector相同类型的向量。

    步骤4:检查Elasticsearch版本

    确保你使用的Elasticsearch版本支持cosineSimilarity函数。这个函数是在Elasticsearch 7.9.0中引入的,所以如果你的版本低于这个版本,你需要升级。

    完整示例代码

    下面是一个完整的Python示例,展示如何使用cosineSimilarity进行搜索:

    from elasticsearch import Elasticsearch
    
    es = Elasticsearch()
    
    query = {
      "script_score": {
        "query": {
          "match_all": {}
        },
        "script": {
          "source": "cosineSimilarity(params.query_vector, doc['vector_field']) + 1.0",
          "params": {
            "query_vector": [0.144, 0.555, 0.888]
          }
        }
      }
    }
    
    response = es.search(index="long_title", body=query)
    
    print(response)
    

    确保在尝试上述步骤前,你已经根据实际情况调整了vector_field的名称以及query_vector的值。如果还有任何问题,检查日志文件或使用explain功能来获取更详细的错误信息。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月17日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?