ElasticSearch:如果文档中存在字段,则在script_score函数内执行余弦相似度

问题描述

我正在尝试在script_score函数中使用余弦相似度。当我要衡量相似性的文档中缺少密集矢量字段时,查询中断。

我花了很多时间搜索如何检查文档中是否存在该字段,但是无法成功。

我尝试过:

  1. 使用doc ['field_name'] == null
  2. 检查
  3. 使用doc ['field_name']。size()== 0进行检查
  4. 使用doc ['field_name']。value == null
  5. 检查

我正在使用的查询

form

我遇到以下错误

POST /sidx-4111c0fc-a8ba-523c-9851-34a2b803643b/_search/
{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": {
            "multi_match": {
              "query": "nri customer bank loan","fields": [],"fuzziness": "AUTO"
            }
          }
        }
      },"functions": [
        {
          "script_score": {
            "script": {
              "source": "double score =0; score = doc['dense_vector_field'] == null ?0: cosinesimilarity(params.qv,'dense_vector_field'); if(score>=0.8 && score<=1.0){return 10000+score;} else if(score>=0.60 && score<0.80){return score+1000;} else{return score+100}","params": {
                "qv": [1,1,1]
              }
            }
          }
        }
      ],"boost_mode": "sum"
    }
  }
}

有人可以帮我吗

解决方法

您还可以调用doc.containsKey('dense_vector_field'),它返回一个布尔值。

在相关说明中,当参数中唯一的键为params.queryVector时为什么还要访问qv

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...