当前位置: 首页 > 知识库问答 >
问题:

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

鲜于承基
2023-03-14

我想使用查询来比较多个字段。我有字段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]”。值

共有2个答案

司徒啸
2023-03-14

为了使用多个条件,“必须”、“应该”和“必须不”可以用作数组,并且每个条件都位于其中的元素上。根据Elasticsearch文档

"query": {
  "bool" : {
    "must" : {
      "term" : { "user" : "kimchy" }
    },
    "filter": {
      "term" : { "tag" : "tech" }
    },
    "must_not" : {
      "range" : {
        "age" : { "gte" : 10, "lte" : 20 }
      }
    },
    "should" : [
      { "term" : { "tag" : "wow" } },
      { "term" : { "tag" : "elasticsearch" } },
      { "term" : { "tag" : "and so on" } }
    ],
    "minimum_should_match" : 1,
    "boost" : 1.0
  }
}
丁正阳
2023-03-14

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

doc['field1'].value > doc['field2'].value && doc['field3'].value > doc['field4'].value
                                           ^
                                           |
                               replace the semicolon by &&
 类似资料:
  • 问题内容: 我想使用查询来比较多个字段。我有字段1到4。我想搜索字段1大于字段2并且下面的查询工作正常的数据; 现在,我想搜索哪个字段1大于字段2以及哪个字段3大于字段4的数据。根据Elastic Search:如何编写多语句脚本?和此链接,我只需要用分号分隔每个语句。所以应该是这样的: 但是该查询无效,并返回如下编译错误: ] .value> doc [‘field2’]。value; doc

  • 问题内容: 我在Elasticsearch索引中的文档中存储了值。 我需要对值进行一些日期操作,并返回要在过滤器中使用的布尔值。 该脚本涵盖了几行,但我无法运行它。 我编写了其他可以正常工作的脚本,但是我对Groovy的了解甚少,而对Elastic search的了解却很少。 我可以用脚本找到的每个样本只有一行,只有一行。 所以基本上我将如何采用这个完全有效的脚本 并把它变成像 我对创建一个只写一

  • 很抱歉提出这个问题,但ElasticSearch查询可能会令人困惑。。。 目标:创建一个类似谷歌搜索查询的查询。输入的单词越多,得到的匹配结果越少。例如“四川酱”比“木兰四川酱”产生更多的结果。我的索引有一个博客文章类型,它有字段“标题”、“标签”、“类别”。ElasticSearch必须找到与查询中的所有单词相匹配的每个文档。文字可以遍布各个领域。例如,如果一个文档的标题包含“木兰”,它的标签包

  • 我目前正在尝试将一个基于Solr的应用程序迁移到ElasticSearch。 我有这个lucene查询 根据我的理解,这是一个必须子句与布尔OR结合的组合: “获取名称中包含(foo和bar)或信息中包含(foo和bar)的所有文档。之后,根据条件筛选结果state=1,并增强具有图像的文档。” 我一直试图在MUST中使用bool查询,但未能将boolean或转换为MUST子句。以下是我的资料:

  • 问题内容: 我有一个用于Elasticsearch的简单JSON查询,如下所示: 仅当值(在这种情况下为“ a1”)不为空时,才如何执行第二个“必须”条件? 问题答案: 您可以使用以下方法实现它-

  • 编写HTTP/1.1和HTTP/2.0脚本 有时,我们希望编写一个快速的脚本而不会遇到创建类的麻烦。addons机制具有一种速记方式,可以将模块作为一个整体视为一个addon对象。这使我们可以将事件处理程序函数放在模块作用域中。例如,下面是一个完整的脚本,它向每个请求添加标头。 def request(flow): flow.request.headers["myheader"] = "v