ElasticSearch исключает результат из фильтрации при выполнении условия - PullRequest
1 голос
/ 09 апреля 2019

Я хочу исключить некоторые результаты из фильтрации по geo_distance, где выполняется условие.

Например, я фильтрую свои результаты по географическому расстоянию, но я хочу включить все результаты, где статус ненормальный и соответствует запросу match_phrase (даже если он находится за пределами geo_distance)

        GET /drive/_search
        {
          "query": {
            "bool": {
              "should": [
                {
                  "match_phrase": {
                    "keywords": "wheels"
                  }
                },
                {
                  "match_phrase": {
                    "name": "car sale"
                  }
                }
              ],
              "filter": [
                {
                  "term": {
                    "status": "normal"
                  }
                },
                {
                  "geo_distance": {
                    "distance": "0.09km",
                    "address.coordinate": {
                      "lat": -33.703082,
                      "lon": 18.981069
                    }
                  }
                }
              ]
            }
          }
        }

Я читал документацию и гуглил, но думаю, что могу пойти в неправильном направлении.

Если вы можете указать мне правильное направление или объяснить мне, что может быть лучшее решение для этого, я был бы очень благодарен.

1 Ответ

1 голос
/ 09 апреля 2019

Из doc :

должен

Предложение (запрос) должно появиться в соответствующем документе.Если запрос bool находится в контексте запроса и имеет предложение must или filter, то документ будет соответствовать запросу bool, даже если ни один из запросов must не совпадает.В этом случае эти пункты используются только для влияния на оценку.Если запрос bool находится в контексте фильтра или не имеет ни необходимости, ни фильтра, то по крайней мере один из запросов must должен соответствовать документу, чтобы он соответствовал запросу bool.Этим поведением можно явно управлять, задав параметр Minimum_should_match.

Таким образом, в вашем случае географическое условие находится в « следует », поскольку оно может быть необязательныма остальные в « filter », которые являются обязательными: status и match_phrase

Попробуйте это:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "status": "normal"
          }
        },
        {
          "match_phrase": {
            "name": "car sale"
          }
        },

        {
          "match_phrase": {
            "keywords": "wheels"
          }
        }
      ],
      "should": [
        {
          "geo_distance": {
            "distance": "0.09km",
            "address.coordinate": {
              "lat": -33.703082,
              "lon": 18.981069
            }
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...