【问题标题】:PHP Elasticsearch 7.5 - Painless script condition is not providing proper resultsPHP Elasticsearch 7.5 - 无痛脚本条件未提供正确结果
【发布时间】:2020-04-15 23:26:26
【问题描述】:

这是我的弹性搜索查询。我正在尝试获取满足条件的所有文档,如果job_id 为1,则获取具有sourced = 0 的文档,否则如果job_id 不是1,则获取具有sourced = 1 的文档。

但它会返回所有文档。

[
'script' => 
    ['script' => 
        [
            'lang' => 'painless', 
            'source' => "(doc['job_id'].size() > 0 && doc['job_id'].value !==  params.jid) || (doc['job_id'].size() > 0 && doc['job_id'].value == params.jid && doc['sourced'].value == 0)",
            'params' => ['jid' => 1]
        ]
    ]
]

引用字段的映射

"job_id" : {
      "type" : "long"
    },
"sourced" : {
      "type" : "byte"
    },

【问题讨论】:

  • 你能分享你的映射吗?您的查询不符合问题要求。
  • 感谢回复,我已为选定字段添加映射

标签: php elasticsearch elasticsearch-php


【解决方案1】:

每个文档都由内联脚本评估。

一个示例(基于您的映射):

插入文档

PUT my_index/_doc/1
{
  "job_id": 1,
  "sourced": 0
}

PUT my_index/_doc/2
{
  "job_id": 0,
  "sourced": 2
}

搜索查询

GET my_index/_search (Kibana usage)
{
  "query": {
    "script": {
      "script": {
        "lang": "painless",
        "source": "doc['job_id'].value == params.jid ? doc['sourced'].value == 0 : doc['sourced'].value == 1",
        "params": {
          "jid": 1
        }
      }
    }
  }
}

您的使用情况

[
'script' => 
    ['script' => 
        [
            'lang' => 'painless', 
            'source' => "doc['job_id'].value == params.jid ? doc['sourced'].value == 0 : doc['sourced'].value == 1",
            'params' => ['jid' => 1]
        ]
    ]
]

结果

 "hits" : [
  {
    "_index" : "my_index",
    "_type" : "_doc",
    "_id" : "1",
    "_score" : 1.0,
    "_source" : {
      "job_id" : 1,
      "sourced" : 0
    }
  }
]

希望对你有帮助

【讨论】:

  • 这对我有用,谢谢@Assael,但我必须为 7.5 版再做 1 件事。甚至在访问 .value 之前检查 doc['fieldname'].size() > 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2017-07-31
相关资源
最近更新 更多