поиск результатов упругой поисковой фильтрации с и и или условиями - PullRequest
0 голосов
/ 18 мая 2018

У меня есть индекс со следующими документами:

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

Документ транспортное средство является вложенным типом.

Я хочу отфильтровать результаты:

ВЫБЕРИТЕ, ГДЕ местоположение = SF AND (vehicle.type = car ИЛИ vehicle.type = самолет ИЛИ не существует (vehicle.type)

Я не смог найти способсделайте это.

Есть ли способ выполнить такой фильтр в Elasticsearch?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Я нашел способ сделать это, это немного сложно, но:

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"
                                      }
                                    }
                                  ]
                                }
                              }
                            ]
                          }
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}
0 голосов
/ 18 мая 2018

Этот запрос может быть полезен.

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"
                }
              }
            }
          }
        ]
      }
    }
  ]
}
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...