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

筛选项的Elasticsearch DSL语法

端木望
2023-03-14

我有一个弹性搜索查询,可以使用multi_match和range过滤器,但我无法找到添加术语过滤器的正确语法。

我使用的是elasticsearch版本7.1.0。

以下是有效的查询:

{
    "body": {
        "query": {
            "bool": {
                "must": {
                    "multi_match": {
                        "query": "nuclear power"
                    }
                },
                "filter": {
                    "range": {
                        "displaydate": {
                            "gte": "2019-07-02T16:26:04Z"
                        }
                    }
                }
            }
        }
    }
}

这将从我的索引中返回所有与“核能”短语匹配的文档,这些文档的发布日期在2019-07-02-16:26之后。

我现在希望能够过滤查询,以便它只返回某种类型的结果。索引中有一个名为object_type的字段,用于存储索引中每个项的对象类型。

我希望返回对象类型为'CORE_PAGE'或'MODULE_PAGE'的结果。我使用了'terms'而不是'term',因为'term'不支持值数组。

这就是我添加术语过滤器的方式:

{
    "body": {
        "query": {
            "bool": {
                "must": {
                    "multi_match": {
                        "query": "nuclear power"
                    }
                },
                "filter": {
                    "terms": {
                        "object_type": [
                            "Core_Page",
                            "Module_Page"
                        ]
                    },
                    "range": {
                        "displaydate": {
                            "gte": "2019-07-02T16:16:50Z"
                        }
                    }
                }
            }
        }
    }
}

但现在我从ElasticSearch中返回了一个解析错误:

Elasticsearch\Common\Exceptions\BadRequest400Exception: 
{
  "error":
    {"root_cause":
        [
            {
                "type":"parsing_exception",
                "reason":"[terms] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
                "line":1,
                "col":142
             }
         ],

         "type":"parsing_exception",
         "reason":"[terms] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
         "line":1,
         "col":142
    },
    "status":400
}

我如何构造查询,使其对ElasticSearch解析器有意义?

共有1个答案

宇文温文
2023-03-14

当您有几个筛选器时,需要在数组中指定它们,如下所示:

{
  "body": {
    "query": {
      "bool": {
        "must": {
          "multi_match": {
            "query": "nuclear power"
          }
        },
        "filter": [
          {
            "terms": {
              "object_type": [
                "Core_Page",
                "Module_Page"
              ]
            }
          },
          {
            "range": {
              "displaydate": {
                "gte": "2019-07-02T16:16:50Z"
              }
            }
          }
        ]
      }
    }
  }
}

必须must_notshoul也是如此

 类似资料:
  • 我希望,如果我选择“mammals”,动物选择选项只显示值为1的选项data-animal_class。 我知道如何获得哺乳动物值,但我不知道如何使用过滤器 这是我的代码:

  • 问题内容: 使用Java Stream时,映射后有时会出现空值。当前,当这些值需要省略时,我使用: 对于更实用的样式,可以快速编写一个小的辅助方法: 这样您就可以使用方法引用了: 我找不到这样的jdk方法,即使我怀疑它们中已经包含了一种。这里有其他方法吗?还是他们出于某种原因忽略了这一点? 问题答案: 您可以从Java8 SDK 使用Objects :: nonNull :

  • 我在lexer语法文件中编写并用antlr4编译它。上面说 看来“filter”只适用于ANTLR3 我查了wikihttp://www.antlr.org/wiki/display/antlr4/options,没有找到答案。“filter”关键字也不在源文件https://github.com/antlr/antlr4/blob/master/tool/src/org/antlr/v4/too

  • 假设一个类MyClass: 这条流: 我想返回中包含条目的的每个实例。 如果我想要一份清单 但我真正需要的是一个列表 这就是我现在拥有的: 但不知怎的,这感觉不太对。除了在谓词中打开一个新的流之外,还有什么更清洁的解决方案吗?

  • 我正在使用ffmpeg来生成一个mp3+JPG的漂亮视频。 这不起作用:ffmpeg-y-i 1.mp3-loop 1-i 1.jpg-filter_complex“[0:a]showwaves=s=1280x720:mode=line,colorkey=0x000000:0.01:0.1,format=yuva420p[v];[1:v][v]overlay[outv]”-filter_compl

  • 如何使用RxJava过滤项目列表? 我有以下代码,发出: 并且我想在之后应用筛选器。您可以在下一段代码中看到我的解决方案,但也许还有更好的方法?