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

java - 请问 es should 下嵌套多个 must 怎么写?

赫连宏伯
2023-12-08

请问下如下 sql 语句如何转换为 ES 的 DSL 语句:

select * from table where ( ( sex = 1 or sex = 2 ) and ( color = 226 or color = 229 ) ) OR (( sex = 0 or sex = 3 ) and ( color = 226 ) );

按我的理解,我写了下面一个 dsl 查询语句,但是报错:

{    "query": {        "bool": {            "should": [{                "must": [{                    "bool": {                        "should": [{                            "match": {                                "tags": "1"                            }                        }]                    }                }]            }]        }    },    "size": 2}

报错内容:

{  "error": {    "root_cause": [      {        "type": "parsing_exception",        "reason": "[must] query malformed, no start_object after query name",        "line": 5,        "col": 13      }    ],    "type": "x_content_parse_exception",    "reason": "[5:13] [bool] failed to parse field [should]",    "caused_by": {      "type": "parsing_exception",      "reason": "[must] query malformed, no start_object after query name",      "line": 5,      "col": 13    }  },  "status": 400}

共有1个答案

涂泰平
2023-12-08

你的 SQL 查询语句和尝试的 Elasticsearch 查询语句有些混淆。在 Elasticsearch 中,我们需要将查询条件组合在一个对象中,如 bool 对象。对于你的 SQL 查询,你应该将其转化为如下的 Elasticsearch 查询语句:

{  "query": {    "bool": {      "must": [        {          "bool": {            "must": [              { "match": { "sex": "1" } },              { "match": { "color": "226" } }            ],            "should": [              { "match": { "sex": "2" } },              { "match": { "color": "229" } }            ]          }        },        {          "bool": {            "must": [              { "match": { "sex": "0" } },              { "match": { "color": "226" } }            ],            "should": [              { "match": { "sex": "3" } },              { "match": { "color": "226" } }            ]          }        }      ]    }  },  "size": 2}

以上这段代码应该可以正确地模拟你的 SQL 查询。这段代码的意思是有多个 bool 查询,每个 bool 查询都包含一个 must 查询和一个 should 查询。在 should 查询中,只需要匹配其中的一项就可以。所以,第一个 should 查询表示的是 sex 为 1 或 2,且颜色为 226 或 229。第二个 should 查询表示的是 sex 为 0 或 3,且颜色为 226。只有当所有的 must 查询和至少一个 should 查询匹配时,这个记录才会被返回。

 类似资料:
  • 如果希望在匿名类中实现多个方法,那么使用将如何处理,例如: …等等?

  • 宽度不定,图片和主要参建单位居中对齐,右边文字可以换行但是第一行和参建单位对齐

  • 我很少有像下面这样的课 我希望根据聚合项,对于每一个聚合,子项都应该通过以以下方式聚合:

  • 问题内容: 我今天才刚开始编写Go(有0个经验),想知道Go是否支持任何形式的“构建所有源文件” 。 我的项目结构是 当我做 这失败了,这是正确的,因为所有源文件都在子包中。 是否有一个命令可以构建所有子包, 而无需显式列出每个 子包? 问题答案: 你以后到基本目录,使用注意,有3个阶段,因为它是一个省略号。这将递归地构建所有子目录。当然,您始终可以从任何地方进行操作而无需访问目录。 对于使用依赖

  • 该怎么解决?之前都能启动的,也没有找到哪里写了这个路径的文件;打包也没报错 yml文件: 这里是读取这两个yaml文件的意思吗?