Хобрук: Ваш путь к мастерству в программировании

Elasticsearch получает элементы, удовлетворяющие двум условиям

У меня есть элементы db со следующей структурой:

  {
   "id": 324214,
   "modDate": "2014-10-01",
   "otherInfo": {
        ..
         ..
    }
  } 

Предположим, что у меня есть список пар [id, modDate]:

 Map<String, String> idAndModDate

который содержит f.e (324214, "2014-10-01"), (3254757, "2015-10-04")..

Теперь я хотел бы использовать Java Api Elasticsearch QueryBuilder для создания запроса, который в результате дает мне список всех «идентификаторов», которые присутствуют в системе, но для которых modDate отличается от заданного.

Предположим, что у меня есть элементы базы данных со следующими парами идентификатор/дата:

  id, date
  1, 2015-01-01
  2, 2014-03-02
  3, 2000-01-22
  4, 2020-09-01

Теперь я хочу создать запрос для

Карта со следующими данными:

  Map<String, String> idDataPairs =[
    (1, 2015-01-01) 
    (2, 2014-03-03) 
    (3, 2000-01-22)
    (7, 2020-09-01)]

теперь я хочу создать функцию, например

  List<String> ids = search(Map<String, String>) {
       QueryBuilder.(sth).(sth) <--- thats what I'm asking about
  }

который вернет идентификаторы: 1, 3, потому что эти идентификаторы существуют в БД, а даты из запроса равны датам в БД соответственно.

09.07.2015

  • Мне непонятно, что вы имеете в виду, когда говорите modDate is different as given? Вы хотите сопоставить индекс, а затем убедиться, что дата отличается? 09.07.2015
  • Добавлю несколько пояснений. 09.07.2015

Ответы:


1

Это то, что вы ищете, более или менее.

//build the test data in the map
Map<String, String> idDataPairs = new HashMap<String, String>();
    idDataPairs.put("1", "2015-01-01");
    idDataPairs.put("2", "2014-03-03");
    idDataPairs.put("3", "2000-01-22");
    idDataPairs.put("4", "2020-09-01");

//construct the query
BoolQueryBuilder should = QueryBuilders.boolQuery();
for(String id : idDataPairs.keySet()){
    BoolQueryBuilder bool = QueryBuilders.boolQuery();
    bool.must(QueryBuilders.termQuery("id", id));
    bool.must(QueryBuilders.termQuery("modDate", idDataPairs.get(id)));
    should.should(bool);
}
should.minimumNumberShouldMatch(1);

Что я делаю, так это: для каждой из пар я создаю BoleanQuery с именем bool. Этот логический запрос имеет два условия must, что и id, и date ДОЛЖНЫ соответствовать документу.

После создания одного bool логического запроса я также добавляю его к родительскому логическому запросу. На этот раз я говорю, что внутренний bool запрос должен совпадать, но это не обязательно. Последняя строка говорит, что хотя бы один из этих запросов должен соответствовать, если мы хотим, чтобы документ совпадал.

Эту структуру легче понять, потому что must работает как И, а should работает как ИЛИ, но еще один способ сделать это — использовать запрос условий, где мы создаем несколько запросов условий, а затем добавляем их к другому родительскому логическому запросу, используя should.

Итак, для данных

  id, date
  1, 2015-01-01
  2, 2014-03-02
  3, 2000-01-22
  4, 2020-09-01

приведенный выше код вернет документы с идентификаторами 1,2,3

10.07.2015
  • Спасибо ! Я придумал свое решение описанной проблемы, но это выглядело так, как будто левой рукой достаешь до левого уха, выбирая путь за головой :D 10.07.2015
  • Новые материалы

    Почему шаблоны проектирования и почему нет?
    Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

    Создание дизайна обуви с помощью машинного обучения
    Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

    GraalVM в 2022 году: итоги года
    2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..

    Быстрая разработка: волшебный мир больших языковых моделей
    РУКОВОДСТВО Быстрая разработка: волшебный мир больших языковых моделей Подход, основанный на данных, для получения наилучшего ответа Искусство и наука Можно ли совместить машинное..

    Ускоренный курс по Node Redis
    Сегодня мы будем учиться использовать Redis в Node.js, однако я не собираюсь вываливать сюда всю документацию и утомлять вас до смерти. Это руководство для начинающих? — спросите вы. Ну..

    Обзор Python для науки о данных и машинного обучения
    Python стал наиболее предпочтительным языком программирования среди разработчиков, которые в основном занимаются наукой о данных и машинным обучением. Интуитивно понятные и уникальные функции..

    Принудительный сброс состояния компонента React с помощью ключевого свойства
    Принудительный сброс состояния компонента React с помощью ключевого свойства Знаете ли вы, что вы можете использовать опору key для принудительного сброса состояния компонента? В..