Как объединить результаты запроса к Elastic + фильтр с Mysql?
Есть некий набор данных размером 300 млн строк каждый день. Набор данных состоит из нескольких полей: одно текстовое поле, остальные числовые. В текстовом поле уникальных значений около 80 млн за все время. Как реализовать схему, при которой мы эти 80 млн уникальных значений грузим в эластик, остальное в Mysql. Сложность в том, что поиск нужно делать одновременно и по текстовому полю, и по числовым данным (условие И). Например, вбиваем в эластик некий запрос, выдает X релевантных результатов, но по числовому фильтру они не подходят, подходит только результат в позиции X+1 например. Если грузить в эластик все 300 млн денормализованных данных, размер индекса становится очень большим (несколько десятков гигабайт, а данные нужны за месяц к примеру), да и грузятся они достаточно долго (за сутки успевает, но впритык). То есть как можно заджоинить результаты выдачи эластика и mysql?
Грузите в эластик только, по чему индексируете, затем любой запрос из эластика возвращает ТОЛЬКО ид записей, а уже по ид достаёте полные записи из mysql по запросу select * from tbl where id in (1,2,3)
В этом случае эластик не будет учитывать числовые фильтры и возможна ситуация, при которой по текстовому полю результат релевантный, по числовому - нет. Как одновременно учитывать оба фильтра в разных базах данных?
iva3682, ещё раз: надо положить всё в эластик, но не все данные, а только нужные для поиска, делать запрос в эластик, получать ид записей, и уже по ид вытаскивать из базы полные данные.
Евгений, запрос с mysql должен быть не select * from tbl where id in (1,2,3), где 1,2,3 - id записей из эластика, а select * from tbl where id in (1,2,3) and field1 in (5,6,7) and field2 in (7,8,9), где field1 и field2 поля, по которым тоже должен осуществлятся фильтр записей из эластика. Ожидается, что эластик выдаст N первых релевантных записей по текстовому полю, но mysql не вернет уже N записей, так как field1 и field2 могут не подойти. Например, ищем мы Телевизор (текстовое поле из эластика) для Москвы (числовое поле из мускула) со статусом В наличии (числовое поле из мускула), эластик возвращает релевантные результаты 10 первых записей, но получается что вернул результаты которые есть только в Питере и Нет в наличии, а для Москвы и В наличии, он на 11 месте в эластике. То есть есть ли технологии заджоинить релультаты выдачи эластика и мускул в одном запросе?
iva3682, я не вижу смысла продолжать диалог, вы не понимаете что всё по чему ищете нужно засунуть в эластик, пытаетесь объединить два поиска эластик+мускл, но ничего у вас не получится.
Евгений, я написал в самом запросе что если данные денормализовать и затолкать все в эластик (все 300 млн записей каждый день), то индекс получается очень большим, а если записать только нужных для поиска 80 млн за все время, то индекс получается разумным, а остальные данные либо в мускул либо в кликхаус
iva3682, а вы точно не запихиваете в эластик лишнее? Ну тогда остается вариант с
where id in (1,2,3) and field1 in (5,6,7) , если мускл только усекает результат из эластика
iva3682, да я точно знаю что так не получится и надо всё пихать в эластик, но по-минимуму, иначе будет ерунда.
Эластик умеет в кластер как раз для таких случаев.
Евгений, точно, если эти данные есть там в этом датасете, значит они там нужны. Да, как раз проблема в том что мускул может отсечь часть данных. В этом случае конечно можно опять бежать в эластик за второй страницей, потом опять в мускул, но выглядит это не очень, как костыль.