elasticsearch中filter和must的组合

kh212irz  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(2)|浏览(982)

在must中添加查询过滤器和将查询过滤器和must分开有什么区别?
我需要应用一个过滤器查询来搜索,但这两个查询中的任何一个对我来说都是一样的。我想知道有没有什么不同。
案例1:

"query": {
    "bool": {
      "must": [
        {
          "term": {
            "field": {
              "value": "VALUE"
            }
          }
        },
        {
          "bool": {
            "filter": [
              {
                "script": {
                  "script": {
                    "source": """
                  return true;

                """
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }

案例2:

"query": {
    "bool": {
      "must": [
        {
          "term": {
            "field": {
              "value": "VALUE"
            }
          }
        }
      ],
      "filter": [
              {
                "script": {
                  "script": {
                    "source": """
                  return true;

                """
                  }
                }
              }
            ]
    }
  }

我认为他们没有什么不同,但我需要推荐人。问候语。

k0pti3hp

k0pti3hp1#

它们的工作原理完全相同,第二种语法更可取,因为它不像第一种那样嵌套,更易于阅读。

h79rfbju

h79rfbju2#

两个查询的工作方式完全相同
有关布尔查询的更多信息,请参阅文档
must:子句(query)必须出现在匹配的文档中,并且将对得分起作用。
筛选器:子句(查询)必须出现在匹配的文档中。但是,查询的分数将被忽略。filter子句是在filter上下文中执行的,这意味着评分被忽略,子句被考虑用于缓存。
组合了多个bool查询的第一个查询的结构:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {},
          "bool": {
            "filter": {
              "script": {}
            }
          }
        }
      ]
    }
  }
}

包含单个布尔查询的第二个查询的结构:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {}
        }
      ],
      "filter": [
        {
          "script": {}
        }
      ]
    }
  }
}

如您所见,在这两个搜索查询中,只有在满足术语查询和脚本查询条件时,文档才会匹配

相关问题