Как найти записи, соответствующие результату предыдущего поиска, используя сценарии ElasticSearch Painless - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть индекс, который я прикрепил ниже.

Каждый документ в индексе содержит имя и рост Алисы или Боба и возраст, в котором был измерен рост. Измерения, сделанные в возрасте 10 лет, помечены как «baseline_height_at_age_10»: true

Мне нужно сделать следующее:

  1. Найдите рост Алисы и Боба в возрасте 10 лет.
  2. Элемент списка. Возврат к Алисе и Бобу записей, где рост в возрасте 10 лет ниже, чем их рост.

Итак, мой вопрос: Может ли Painless выполнять такой поиск? Я был бы признателен, если бы вы указали мне хороший пример для этого.

Кроме того: ElasticSearch Painless - даже хороший подход к этой проблеме? Можете ли вы предложить

Отображения индекса

PUT /shlomi_test/
{
  "mappings": {
    "_doc": {
      "properties": {
        "first_name": {
          "type": "keyword",
          "fields": {
            "raw": {
              "type": "text"
            }
          }
        },
        "surname": {
          "type": "keyword",
          "fields": {
            "raw": {
              "type": "text"
            }
          }
        },
        "baseline_height_at_age_10": {
          "type": "boolean"
        },
        "age": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      }
    }
  }
}

Индексные данные

POST /test/_doc/alice_green_8_110
{
  "first_name": "Alice",
  "surname": "Green",
  "age": 8,
  "height": 110,
  "baseline_height_at_age_10": false
}

POST /test/_doc/alice_green_10_120
{
  "first_name": "Alice",
  "surname": "Green",
  "age": 10,
  "height": 120,
  "baseline_height_at_age_10": true
}

POST /test/_doc/alice_green_13_140
{
  "first_name": "Alice",
  "surname": "Green",
  "age": 13,
  "height": 140,
  "baseline_height_at_age_10": false
}

POST /test/_doc/alice_green_23_170
{
  "first_name": "Alice",
  "surname": "Green",
  "age": 23,
  "height": 170,
  "baseline_height_at_age_10": false
}



POST /test/_doc/bob_green_8_120
{
  "first_name": "Alice",
  "surname": "Green",
  "age": 8,
  "height": 120,
  "baseline_height_at_age_10": false
}

POST /test/_doc/bob_green_10_130
{
  "first_name": "Alice",
  "surname": "Green",
  "age": 10,
  "height": 130,
  "baseline_height_at_age_10": true
}

POST /test/_doc/bob_green_15_160
{
  "first_name": "Alice",
  "surname": "Green",
  "age": 15,
  "height": 160,
  "baseline_height_at_age_10": false
}

POST /test/_doc/bob_green_21_180
{
  "first_name": "Alice",
  "surname": "Green",
  "age": 21,
  "height": 180,
  "baseline_height_at_age_10": false
}

Ответы [ 2 ]

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

Я отправил тот же вопрос, с акцентом на скриптинг без боли, форум поддержки ElasticSearch Как найти записи, соответствующие результату предыдущего поиска, используя скрипты ElasticSearch Painless

и ответ был:

«Я не думаю, что безболезненный подход будет работать здесь. Вы не можете использовать результаты одного запроса для выполнения второго запроса безболезненно.

Двухэтапный подход, который вы наметите в конце своего поста, это путь. "

Суть в том, что вы не можете использовать результат одного запроса в качестве входных данных для другого запроса. Вы можете фильтровать и агрегировать и многое другое, но не это.

Итак, подход выглядит примерно так:

согласно моему пониманию, предлагает сделать 1-й поиск, процесс данные и сделать дополнительный поиск. Это в основном означает:

  1. Поиск записи, где first_name = Алиса и baseline_height_at_age_10 = True.
  2. Процесс извне, чтобы извлечь значение высоты для Алисы в возрасте 10 лет.
  3. Поиск записей Алисы, где ее рост ниже значения, рассчитанного извне.
1 голос
/ 18 апреля 2019

Вы должны быть в состоянии сделать это, просто используя агрегаты.Если предположить, что люди только когда-либо становятся выше, а измерения точны, вы можете ограничить запрос только теми документами в возрасте 10 лет или младше, найти их максимальную высоту, а затем отфильтровать их результаты, чтобы исключить базовый результат

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