Elasticsearch: объединить все уникальные значения поля и применить условие или фильтр по другому полю - PullRequest
0 голосов
/ 06 февраля 2020

Мои документы выглядят так:

{
    "ownID": "Val_123",
    "parentID": "Val_456",
    "someField": "Val_78",
    "otherField": "Val_90",
     ...
}

Я пытаюсь получить все (уникальные, как в одном случае) результаты для списка ownID значений при фильтрации по список parentID значений и наоборот.

Что я сделал до сих пор:

  • Получить (отдельно!) уникальные значения для ownID и parentID in key1 и key2
{
  "size": 0,
  "aggs": {
    "key1": {
      "terms": {
        "field": "ownID",
        "include": {
          "partition": 0,
          "num_partitions": 10
        },
        "size": 100
      }
    },
    "key2": {
      "terms": {
        "field": "parentID",
        "include": {
          "partition": 0,
          "num_partitions": 10
        },
        "size": 100
      }
    }
  }
}
  • Используйте фильтр для получения (некоторых) результатов, соответствующих либо ownID ИЛИ parentID
{
  "size": 0,
  "query": {
    "bool": {
      "should": [
        {
          "terms": {
            "ownID": ["Val_1","Val_2","Val_3"]
          }
        },
        {
          "terms": {
            "parentID": ["Val_8","Val_9"]
          }
        }
      ]
    }
  },
  "aggs": {
    "my_filter": {
      "top_hits": {
        "size": 30000,
        "_source": {
          "include": ["ownID", "parentID","otherField"]
        }
      }
    }
  }
}

Однако мне нужно получить отдельные результаты для каждого фильтра во втором запросе, и получите:

  • (1) parentID документов, соответствующих некоторому значению ownID
  • (2) ownID для документов, соответствующих некоторому значению parentID .

Пока мне удалось сделать это с помощью двух похожих запросы (см. ниже для (1) ), но в идеале хочу объединить их и запросить только один раз.

{
  "size": 0,
  "query": {
    "bool": {
      "should": [
        {
          "terms": {
            "ownID": [ "Val1", Val_2, Val_3 ]
          }
        }
      ]
    }
  },
  "aggs": {
    "my_filter": {
      "top_hits": {
        "size": 30000,
        "_source": {
          "include": "parentID"
        }
      }
    }
  }
}

Я использую Elasticsearch версии 5.2

1 Ответ

1 голос
/ 07 февраля 2020

Если я правильно понял ваш вопрос, то вам нужно получить правильное количество всех агрегатов независимо от запроса фильтра, но при поиске в поиске вы хотите только отфильтрованные документы, поэтому для этого эластичного поиска есть другой тип фильтра: «постфильтр»: обратитесь к этому: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/search-request-post-filter.html

это действительно просто, он будет просто фильтровать результаты после вычисления агрегации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...