elasticsearch mix“和filter”with“bool filter”

时间:2015-01-20 14:48:15

标签: elasticsearch

我在弹性搜索上工作,我尝试混合两个工作查询。第一个用"和过滤"第二个用" bool过滤器"但我失败了。

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

  1. "和过滤器" :
  2. 我需要"并过滤"查询数据,例如一个字段必须等于" africa"或"亚洲"或空的。这是一个工作查询的例子:

    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
        }
      }
    

    }

    1. 第二个查询:
    2. 现在我需要使用以下字段限制结果数据:" D_TYPESTATUS"谁必须与价值不同"类型"并且必须不为空。

      此查询可以执行此操作:

      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
        }
      }
      

      如何整合" bool过滤器"在"和过滤器" ?? 非常感谢

1 个答案:

答案 0 :(得分:1)

我必须遗漏一些东西,因为这很简单:

{
  "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"
                }
              }
            }
          }
        ]
      }
    }
  }
}