弹性搜索脚本评分 |无痛查询

分享于2022年07月17日 elastic-stack elasticsearch elasticsearch-5 kibana 问答
【问题标题】:弹性搜索脚本评分 |无痛查询(Elastic search Script Score | Painless Query)
【发布时间】:2022-06-19 17:54:35
【问题描述】:

我在玩脚本查询,这是我想向社区提出的一个我不太了解的问题

这是一个存储在弹性搜索中的 JSON 示例

{
        "_index" : "XXXXX",
        "_type" : "_doc",
        "_id" : "XXXX==",
        "_score" : 28.134966,
        "_source" : {
          "recruiter_id" : "XXXXX",
          "jobseeker_id" : "XXX",
          "profile_id" : "XXXXX",
          "isBlocked" : "",
          "isConnected" : "",
          "connection_time" : "2022-06-14 20:17:01",
          "status" : "pending",
          "isPending" : "True"
}

这是我写的很好用的查询

GET XXX/_search
{
   "query":{
      "function_score":{
         "query":{
        "match_all": {}
         },
         "script_score":{
            "script":{
              "lang": "painless", 
               "source":"""
                   double total = 0.0;
                   total = total + Math.log(doc['connection_time'].value.millis);
                  
                  return total;
               """
           
            }
         }
         
      }
      
   },
    "sort":[
      {
         "_score":"desc"
      }
   ]
 
}

只要我添加了这一行或 if 语句就会失败

  "script_score":{
            "script":{
              "lang": "painless", 
               "source":"""
                   double total = 0.0;
                   total = total + Math.log(doc['connection_time'].value.millis);
                   
                  if(doc['status'].value == 'accepted'){
                    total = total +100;
                  }
                  return total;
               """
           
            }
         }

我得到的错误是这样的

 "org.elasticsearch.index.mapper.TextFieldMapper$TextFieldType.fielddataBuilder(TextFieldMapper.java:823)",
          "org.elasticsearch.index.fielddata.IndexFieldDataService.getForField(IndexFieldDataService.java:120)",
          "org.elasticsearch.index.query.QueryShardContext.lambda$lookup$1(QueryShardContext.java:328)",
          "org.elasticsearch.search.lookup.SearchLookup.lambda$new$1(SearchLookup.java:68)",
          "org.elasticsearch.search.lookup.LeafDocLookup$1.run(LeafDocLookup.java:95)",
          "org.elasticsearch.search.lookup.LeafDocLookup$1.run(LeafDocLookup.java:92)",
          "java.base/java.security.AccessController.doPrivileged(Native Method)",
          "org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:92)",
          "org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:40)",
          "if(doc['status'].value == 'accepted'){\n            

我所做的是我基本上将字段更改为关键字,但如果语句似乎不会发生

 "script_score":{
            "script":{
              "lang": "painless", 
               "source":"""
                   double total = 0.0;
                   total = total + Math.log(doc['connection_time'].value.millis);
                   
                  if(doc['status.keyword'].value == 'accepted'){
                    total = total +100;
                  }
                  return total;
               """
           
            }
         }

如果有人能指出问题并提出可能的解决方案,那就太好了


【解决方案1】:

请尝试以下查询,您的查询都很好。我在我的系统上复制了你的场景,它工作正常。为了获得更多许可,我已经参加了其他如果条件与它一起。可能是状态字段映射的问题,其中一些可能是给您此错误的文本。

您的查询如下所示:

Elastic search Script Score | Painless Query