用和和/或条件搜索弹性搜索过滤结果

时间:2018-05-18 10:42:04

标签: elasticsearch

我有一个包含以下文件的索引:

{
    "first_name": "f1",
    "last_name": "l1",
    "location": "SF",
    "vehicle": {
        "type": "car",
        "color": "red"
    }
}


{
    "first_name": "f2",
    "last_name": "l2",
    "location": "SF",
    "vehicle": {
        "type": "motorcycle",
        "color": "blue"
    }
}

{
    "first_name": "f3",
    "last_name": "l3",
    "location": "SF",
    "vehicle": {
        "type": "bicycle",
        "color": "green"
    }
}

{
    "first_name": "f4",
    "last_name": "l4",
    "location": "CA",
    "vehicle": {
        "type": "motorcycle",
        "color": "green"
    }
}

{
    "first_name": "f5",
    "last_name": "l5",
    "location": "SF"
}

车辆文档是嵌套类型。

我想过滤结果:

  

SELECT WHERE location = SF AND(vehicle.type = car OR   vehicle.type = airplane OR not-exists(vehicle.type)

我找不到办法。

有没有办法在Elasticsearch上执行这样的过滤器?

谢谢。

2 个答案:

答案 0 :(得分:0)

此查询可能会有所帮助。

POST IndexName/Type/_search
{
  "query": {
  "bool": {
  "must": [
    {
      "term": {
        "location": {
          "value": "sf"
        }
      }
    },
    {
      "bool": {
        "should": [
          {
            "terms": {
              "vehicle.type": [
                "car",
                "airplane"
              ]
            }
          },
          {
            "bool": {
              "must_not": {
                "exists": {
                  "field": "vehicle.type"
                }
              }
            }
          }
        ]
      }
    }
  ]
}
}
}

如果您想按区分大小写搜索位置,请使用以下查询。我已将location.keyword用于匹配区分大小写。

POST IndexName/Type/_search
{
  "query": {
  "bool": {
  "must": [
    {
      "term": {
        "location.keyword": {
          "value": "SF"
        }
      }
    },
    {
      "bool": {
        "should": [
          {
            "terms": {
              "vehicle.type": [
                "car",
                "airplane"
              ]
            }
          },
          {
            "bool": {
              "must_not": {
                "exists": {
                  "field": "vehicle.type"
                }
              }
            }
          }
        ]
      }
    }
  ]
}
}
}

答案 1 :(得分:0)

我找到了一种方法,它有点复杂,但是:

GET indextests/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "location": "SF"
          }
        },
        {
          "bool": {
            "should": [
              {
                "nested": {
                  "path": "vehicle",
                  "query": {
                    "terms": {
                      "vehicle.type": ["car", "bicycle"]
                    }
                  }
                }
              },
              {
                "bool": {
                  "must_not": [
                    {
                      "nested": {
                        "path": "vehicle",
                        "query": {
                          "bool": {
                            "should": [
                              {
                                "bool": {
                                  "must": [
                                    {
                                      "exists": {
                                        "field": "vehicle.type"
                                      }
                                    }
                                  ]
                                }
                              }
                            ]
                          }
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}