Поиск с исключением (НЕОБХОДИМО) в дочерних полях - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу найти все города, в названии улицы которых нет термина "большой".

Вот мои пункты в индексе:

{
  "name":"the big street",
  "city": "NY",
  "count": 2
},
{
  "name":"not big street",
  "city": "AM",
  "count": 43
},
{
  "name":"st42",
  "city": "NY",
  "count": 1687
},
{
  "name":"Anacostia Drive",
  "city": "WASH",
  "count": 1687
},

Мне нужно найти все города , где имя НЕ ДОЛЖНО содержать (исключать) термин "большой".

, когда я пытаюсь использовать запрос термина с must_not

{
  "collapse": {
    "field": "city"
  },
  "query": {
    "bool" : {
"must_not" : {
        "term" : {
          "name" : { "big" }
        }
      },
    }
 }
}

Я обнаружил, что города включают "NY", элемент из-за "st42" - и это неправильно из-за совпадения с "большой улицей" item.

Как решить?

Решение под ним хорошее, но запрос может быть более сложным, и мне нужно выделить:

{
  "aggs": {
    "aggs_by_city": {
      "terms": {
        "field": "city.keyword",
        "size": 20
      },
      "aggs": {

        "filter_exclude_count": {
          "filter": { "match" : { "name" : "big"   }}
        },
        "filter_include_count": {
          "filter": { "match" : { "name" : "Anacostia"   }}
        },
        "selector": {
          "bucket_selector": {
            "buckets_path": {
              "exclude_cnt": "filter_exclude_count._count",
              "include_name": "filter_include_count._count"
            },
            "script": "params.exclude_cnt == 0 && params.include_name > 0"
          }
        }
      }
    }
  },
  "size": 0
}

1 Ответ

1 голос
/ 08 апреля 2020

Похоже, что вы хотите "найти все города, в которых нет улиц с" большим "названием улицы?"

Вы можете сделать это, используя aggregation, это решение не использует collapse:

{
  "aggs": {
    "aggs_by_city": {
      "terms": {
        "field": "city",
        "size": 10
      },
      "aggs": {
        "filter_exclude_count": {
          "filter": { "match" : { "street" : "big"   }}
        },
        "sellector": {
          "bucket_selector": {
            "buckets_path": {
              "exclude_cnt": "filter_exclude_count._count"
            },
            "script": "params.exclude_cnt == 0"
          }
        }
      }
    }
  },
  "size": 0
}
  1. Группировать весь город
  2. Подсчитать все документы, название улицы которых содержит "большой"
  3. Если указанное выше число == 0, выберите это aggs_by_city агрегирование с использованием bucket_selector
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...