elasticsearch,Json,elasticsearch" /> elasticsearch,Json,elasticsearch" />

Json 如何编写Elasticsearch多个必须脚本查询?

Json 如何编写Elasticsearch多个必须脚本查询?,json,elasticsearch,Json,elasticsearch,我想使用查询来比较多个字段。我有字段1到字段4。我想搜索数据,其中字段1大于字段2,下面的查询是完美的工作 { "size": 0, "_source": [ "field1", "field2", "field3", "field4" ], "sort": [], "query": { "bool": { "filter": [],

我想使用查询来比较多个字段。我有字段1到字段4。我想搜索数据,其中字段1大于字段2,下面的查询是完美的工作

{
    "size": 0,
    "_source": [
        "field1",
        "field2",
        "field3",
        "field4"
    ],
    "sort": [],
    "query": {
        "bool": {
            "filter": [],
            "must": {
                "script": {
                    "script": {
                        "inline": "doc['field1'].value > doc['field2'].value;",
                        "lang": "painless"
                    }
                }
            }
        }
    }
}
现在,我想搜索哪个字段1大于字段2,哪个字段3大于字段4的数据。根据,我只需要用分号分隔每条语句。所以它应该是这样的:

{
    "size": 0,
    "_source": [
        "field1",
        "field2",
        "field3",
        "field4"
    ],
    "sort": [],
    "query": {
        "bool": {
            "filter": [],
            "must": {
                "script": {
                    "script": {
                        "inline": "doc['field1'].value > doc['field2'].value; doc['field3'].value > doc['field4'].value;",
                        "lang": "painless"
                    }
                }
            }
        }
    }
}
doc['field1'].value > doc['field2'].value && doc['field3'].value > doc['field4'].value
                                           ^
                                           |
                               replace the semicolon by &&
但该查询不起作用,并返回如下编译错误:

{
    "size": 0,
    "_source": [
        "field1",
        "field2",
        "field3",
        "field4"
    ],
    "sort": [],
    "query": {
        "bool": {
            "filter": [],
            "must": {
                "script": {
                    "script": {
                        "inline": "doc['field1'].value > doc['field2'].value; doc['field3'].value > doc['field4'].value;",
                        "lang": "painless"
                    }
                }
            }
        }
    }
}
doc['field1'].value > doc['field2'].value && doc['field3'].value > doc['field4'].value
                                           ^
                                           |
                               replace the semicolon by &&
{“根本原因”:[{“类型”:“脚本异常”,“原因”:“编译” 错误,“脚本堆栈”:[“doc['field1']。值>doc['…”^---- 此处“]”,“脚本”:“doc['field1'].value>doc['field2'].value; 文档['field1'].value>doc['field2'].value; ,“lang”:“无痛”}],“type”:“搜索\阶段\执行\异常”,“原因”:“全部” 碎片 失败”,“阶段”:“查询”,“分组”:true,“失败的切分”:[{“切分”:0,“索引”:“财务”,“节点”:“8SXAM2HCSTELLPLHVTDSMCQ”,“原因”:{“类型”:“查询切分异常”,“原因”:“失败” 要创建查询:{\n\“bool\”:{\n\“must\”:[\n{\n\“script\”: {\n\“script\”:{\n\“source\”:\“doc['field1']。值> doc['field2'].value;doc['field1'].value>doc['field2'].value;\”,\n \“lang\”:\“无痛\”\n}、\n\“boost\”:1.0\n}\n}\n],\n \“调整纯\负\”:真,\n \“增强\”:1.0\n }\n} “,”索引“:”hz12cHg1SkGwq712n6BUIA“,”索引“:”财务“,”原因“:{”类型“:”脚本异常“,”原因“:”编译 错误,“脚本堆栈”:[“doc['field1']。值>doc['…”^---- 此处“]”,“脚本”:“doc['field1'].value>doc['field2'].value; 文档['field1'].value>doc['field2'].value; “,”朗“:”无痛“,”原因“:{”类型“:”非法参数“,”例外“,”原因“:”不 语句。“}}]}


您需要结合以下两种情况:

{
    "size": 0,
    "_source": [
        "field1",
        "field2",
        "field3",
        "field4"
    ],
    "sort": [],
    "query": {
        "bool": {
            "filter": [],
            "must": {
                "script": {
                    "script": {
                        "inline": "doc['field1'].value > doc['field2'].value; doc['field3'].value > doc['field4'].value;",
                        "lang": "painless"
                    }
                }
            }
        }
    }
}
doc['field1'].value > doc['field2'].value && doc['field3'].value > doc['field4'].value
                                           ^
                                           |
                               replace the semicolon by &&

为了使用多于一个条件,“必须”、“应该”和“必须不”可以用作数组,每个条件都在它的元素上


哇,太感谢你了,你救了我的命。事实上,这是我以前的想法,但在过滤查询中我无法使用-&所以我认为那是不起作用的。我花了几个小时在谷歌上搜索解决方案,我只是感到有压力。很明显,我以前的想法很好。酷,很高兴它有帮助!@Val:知道如何解决吗?答案是OP需要比较两个字段,但在正常情况下无法进行比较,需要使用脚本或在索引时将比较结果存储在新字段中。