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

elasticsearch混合“和过滤器”与“布尔过滤器”

那铭
2023-03-14

我从事elasticsearch,我尝试混合两个工作查询。第一个是“and filter”,第二个是“bool filter”,但我失败了。

我的查询是从用户交互界面动态生成的。

  1. “和过滤器”:

我需要“和过滤器”来查询数据,例如,字段必须等于“非洲”或“亚洲”或为空。这是一个工作查询的示例:

curl -XGET 'http://localhost:9200/botanique/specimens/_search?pretty' -d '
{
    "fields" : ["D_TYPESTATUS", "O_HASMEDIA"],
    "aggs" : {
        "D_TYPESTATUS_MISSING" : {
            "missing" : {
                "field" : "D_TYPESTATUS"
            }
        },
        "D_TYPESTATUS" : {
            "terms" : {
                "field" : "D_TYPESTATUS",
                "size" : 10
            }
        }
    },
    "query" : {
        "filtered" : {
            "filter" : {
                "and" : [
                    { "or" : [{
                                "term" : {
                                    "O_HASMEDIA" : "true"
                                }
                            }
                        ]
                    }, {
                        "or" : [{
                                "term" : {
                                    "T_GENUS" : "flemingia"
                                }
                            }
                        ]
                    }, {
                        "or" : [{
                                "term" : {
                                    "L_CONTINENT" : "africa"
                                }
                            }, {
                                "term" : {
                                    "L_CONTINENT" : "asia"
                                }
                            }, {
                                "missing" : {
                                    "field" : "L_CONTINENT"
                                }
                            }
                        ]
                    }, {
                        "or" : [{
                                "term" : {
                                    "I_INSTITUTIONCODE" : "mnhn"
                                }
                            }
                        ]
                    }
                ]
            }
        }
     }
}'

此查询工作正常,结果如下:

 "hits" : {
    "total" : 1006,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "botanique",
      "_type" : "specimens",
      "_id" : "9459AB31EC354F1FAE270BDB6C22CDF7",
      "_score" : 1.0,
      "fields" : {
        "O_HASMEDIA" : [ true ],
        "D_TYPESTATUS" : "syntype"
      }
    }, 
    ....
  },
  "aggregations" : {
    "D_TYPESTATUS" : {
      "buckets" : [ {
        "key" : "syntype",
        "doc_count" : 6
      }, {
        "key" : "type",
        "doc_count" : 5
      }, {
        "key" : "isotype",
        "doc_count" : 2
      } ]
    },
    "D_TYPESTATUS_MISSING" : {
      "doc_count" : 993
    }
  }

现在我需要用字段“D\u TYPESTATUS”来限制结果数据,该字段必须与值“type”不同,并且不能为null。

此查询工作执行此操作:

curl -XGET 'http://localhost:9200/botanique/specimens/_search?size=10&pretty' -d '    {
    "fields" : ["D_TYPESTATUS", "O_HASMEDIA"],
    "aggs" : {
        "D_TYPESTATUS_MISSING" : {
            "missing" : {"field" : "D_TYPESTATUS"}
        },
        "D_TYPESTATUS" : {
            "terms" : {"field" : "D_TYPESTATUS","size" : 20}
        }
    },
    "query" : { 
        "filtered" : {
            "query" : {
                "query_string" : {  "query" : "liliaceae"  }
            },
            "filter" : {
                "bool" : {
                    "must_not" : [{
                            "term" : {
                                "D_TYPESTATUS" : "type"
                            }
                        }
                    ],
                    "must":{
                            "exists" : {
                                "field" : "D_TYPESTATUS"
                        }
                    }
                }
            }
        }
    }
}'

结果是:

 {[ {
    "_index" : "botanique_tmp2",
    "_type" : "specimens",
    "_id" : "0C388B4A3186410CBA46826BA296ECBC",
    "_score" : 0.9641713,
    "fields" : {
      "D_TYPESTATUS" : [ "isotype" ],
      "O_HASMEDIA" : [ true ]
    }
  } , ... ]},
"aggregations" : {
  "D_TYPESTATUS" : {
    "buckets" : [ {
      "key" : "isotype",
      "doc_count" : 40
    }, {
      "key" : "syntype",
      "doc_count" : 37
    }, {
      "key" : "holotype",
      "doc_count" : 6
    }, {
      "key" : "paratype",
      "doc_count" : 3
    }, {
      "key" : "isonéotype",
      "doc_count" : 2
    } ]
  },
  "D_TYPESTATUS_MISSING" : {
    "doc_count" : 0
  }
}

如何在“和过滤器”中集成“布尔过滤器”??谢谢

共有1个答案

范彭亮
2023-03-14

我一定错过了什么,因为这很容易:

{
  "query": {
    "filtered": {
      "filter": {
        "and": [
          {
            "or": [
              {
                "term": {
                  "O_HASMEDIA": "true"
                }
              }
            ]
          },
          {
            "or": [
              {
                "term": {
                  "T_GENUS": "flemingia"
                }
              }
            ]
          },
          {
            "or": [
              {
                "term": {
                  "L_CONTINENT": "africa"
                }
              },
              {
                "term": {
                  "L_CONTINENT": "asia"
                }
              },
              {
                "missing": {
                  "field": "L_CONTINENT"
                }
              }
            ]
          },
          {
            "or": [
              {
                "term": {
                  "I_INSTITUTIONCODE": "mnhn"
                }
              }
            ]
          },
          {
            "bool": {
              "must_not": [
                {
                  "term": {
                    "D_TYPESTATUS": "type"
                  }
                }
              ],
              "must": {
                "exists": {
                  "field": "D_TYPESTATUS"
                }
              }
            }
          }
        ]
      }
    }
  }
}
 类似资料:
  • 我在ES中有两个问题。对于同一组文档,两者的周转时间都不同。两者在概念上都在做同样的事情。我没有什么疑问 1-这两者之间有什么区别?2-哪个更好使用?3-如果两者相同,为什么表现不同? 映射: 更新1: 我在同一组数据上尝试了bool/必须查询和bool/过滤器查询,但我发现了奇怪的行为 1-bool/必须查询能够搜索所需的文档 2-虽然bool/filter无法搜索文档。如果我删除第二个字段条件

  • 问题内容: “过滤后的查询和过滤器”与“根查询和过滤器”之间有什么区别吗?例如 情况1: 情况2: 我在http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using- filter-outside-td3960119.html中 找到了此讨论,但所引用的URL是404,并且解释过于简洁我。 请示教或提供指出这些区别的

  • 我试图编写一个由2个部分组成的弹性搜索布尔查询。我想要“必须”的两个条件和“应该”的两个条件。问题是我只想得到“应该”的分数。我尝试了“过滤器”,但没有成功。 你有什么想法吗?

  • 问题内容: 根据http://www.elastic.co/guide/zh-cn/elasticsearch/guide/master/combining- filters.html 上的elasticsearch文档,布尔过滤器可以是以下内容: 在含义上,它等效于以下逻辑运算: 这样对吗? 谢谢! 问题答案: 正如Andrei在评论中指出的,这是对 过滤器 的正确理解: 可以翻译成 可以翻译成

  • 问题内容: 使用嵌套对象的布尔运算符时遇到一些麻烦。这是我的映射: 我想获取恰好包含两个指定ip甚至更多的文档。 假设我的文档具有以下ips: 我想通过使用此过滤器进行搜索来仅检索DOC 1: 问题在于,同时检索了DOC 1和DOC2。 问题答案: 你可以使用你的条件过滤器是这样的: 这是我用来测试的一些代码: http://sense.qbox.io/gist/d6b5f4e4c0d2977a0

  • 我所拥有的 预期产出 实际产量 这只是一个例子。在我的真实代码中,我正在对我的全局状态(useContext, useReduer)执行删除操作。 是一个ID数组。