Json 如何编写Elasticsearch多个必须脚本查询?
我想使用查询来比较多个字段。我有字段1到字段4。我想搜索数据,其中字段1大于字段2,下面的查询是完美的工作Json 如何编写Elasticsearch多个必须脚本查询?,json,elasticsearch,Json,elasticsearch,我想使用查询来比较多个字段。我有字段1到字段4。我想搜索数据,其中字段1大于字段2,下面的查询是完美的工作 { "size": 0, "_source": [ "field1", "field2", "field3", "field4" ], "sort": [], "query": { "bool": { "filter": [],
{
"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需要比较两个字段,但在正常情况下无法进行比较,需要使用脚本或在索引时将比较结果存储在新字段中。