Вложенный поисковый запрос в Elasticsearch с диапазонным фильтром и неизвестными именами внутренних полей

Я храню данные в базе данных elasticsearch и пытаюсь запросить их, отфильтровав по диапазону чисел.

Это минимизированная структура документа в моей базе данных:

"a": {
    "b": {
        "x": [1, 2, 3, 4], // note: x, y and z are not compulsory
        "y": [2, 3, 4], // some documents can have only x or z or maybe x and z etc.
        "z": [5, 6]
    }
}

Теперь я хочу, чтобы мой запрос возвращал все документы, где в любом из подполей «b» есть хотя бы одно число в диапазоне от 2 до 4. Здесь важно то, что я не знаю имена всех подполей « б".

Я придумал запрос:

POST /i/t/_search
{
    "query": {
        "query_string": {
            "fields": ["a.b.*"],
            "query": "number:[2 TO 4]"
        }          
    }
}

Запрос не выдает ошибку, но и не возвращает результата. Я даже не уверен, какой тип поискового запроса будет наиболее подходящим для такой задачи. Я использовал только строку запроса, потому что только в ней я мог соединить неизвестное имя поля и диапазон.


person patriciasmh    schedule 25.07.2017    source источник


Ответы (1)


Попробуйте удалить number: в своем запросе:

{
    "query": {
        "query_string": {
            "fields": ["a.b.*"],
            "query": "[2 TO 4]"
        }          
    }
}

При желании попробуйте count:[2 TO 4] (документы)

Другой тип запроса, который позволяет использовать подстановочный знак * в пути к полю, — Multi Match Query, но, честно говоря, я не понимаю, как в вашем случае совместить его с числовым диапазоном. Единственное, что приходит мне на ум:

{
  "query": {
    "bool": {
      "should": [ 
         {
            "multi_match": {
              "query": "2",
              "fields": ["a.b.*"]
            }
          },
          {
            "multi_match": {
              "query": "3",
              "fields": ["a.b.*"]
            }
          },
          {
            "multi_match": {
              "query": "4",
              "fields": ["a.b.*"]
            }
          }
      ]
    }
  }
}

... что довольно некрасиво. Первое решение с query_string короткое и мощное.

person Joanna    schedule 25.07.2017
comment
Привет @Joanna, я запутался, не понимая, как работает elasticsearch на низком уровне. Сколько стоит поиск по a.b.* ?? Elasticsearch должен перебирать все подразделы (x, y, z) и все значения в списке, чтобы соответствовать ему? - person Wonka; 18.06.2018