Elasticsearch исключает ассоциацию нескольких терминов - PullRequest
0 голосов
/ 06 марта 2020

Мне нужно исключить из моего поиска ассоциацию разных терминов. Есть ли какой-нибудь умный способ сделать такое многослойное исключение?

Пример: скажем, я хочу получить всех пользователей, кроме тех, чьи (фамилия Доу ) и (имя Джон или Ann ie или без любого значения имени).

Пример ожидаемых результатов:

first_name | last_name | Search result
--------------------------------------
Bob        | Doe       | appears
--------------------------------------
Annie      | Doe       | excluded 
--------------------------------------
(null)     | Doe       | excluded 
--------------------------------------
John       | Foo       | appears 
--------------------------------------
(null)     | Foo       | appears 

Пока что лучшим, что я сделал, был следующий запрос, но он не работает: в нашем примере этот запрос исключит всех, чья фамилия Doe, Какое бы ни было имя ... и я не могу понять, почему?

GET user/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "last_name": "Doe"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "should": [
              {
                "bool": {
                  "must": [
                    {
                      "terms": {
                        "first_name": [
                          "John",
                          "Annie"
                        ]
                      }
                    }
                  ]
                }
              },
              {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "first_name"
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

Любая помощь Elasti c -резкого глаза на это будет очень цениться!

1 Ответ

1 голос
/ 06 марта 2020

В массиве must_not документ не должен совпадать ни с одним из предложений. Ваш запрос в основном переводится, чтобы не рассматривать документ, если last_name - Doe OR (first_name - ann ie или john или не существует)

Чтобы работать как AND, поместите запрос в bool

{
  "query": {
    "bool": {
      "must_not": [
        {
          "bool": {
            "must": [
              {
                "match": {
                  "last_name": "Doe"
                }
              },
              {
                "bool": {
                  "should": [
                    {
                      "terms": {
                        "first_name.keyword": [
                          "John",
                          "Annie"
                        ]
                      }
                    },
                    {
                      "bool": {
                        "must_not": {
                          "exists": {
                            "field": "first_name"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...