Как фильтровать документы в Elasticsearch по условию если был просмотрен пользователем?

Есть индекс который содержит 20 млн документов.
Есть около 100 тысяч пользователей (и добавляются новые).
Пользователь хочет при следующих поисках не видеть документы, которые он однажды открывал при поиске и например отмечал эти доки.
Идея как их отмечать на стороне еластика: иметь в документе поле например USERID_VIEW и добавлять в него ID пользователей которые отметили этот документ, ну и в поиске игнорировать доки которые содержат ID пользователя в USERID_VIEW .
Но в таком случае это поле (список) может иметь 100 тысяч ID (если все отметят этот документ).
Можно хранить в Mysql id документов и при запросе игнорировать доки с этими ID, но и в этом случае запрос может содержать миллионы ID
Не знаю если копаю в правильном направлении.

Как можно решить эту задачу? Будет ли еластик держать в поле список 100K+ значений или потянет запрос с большим списком в query?
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ответы на вопрос 2
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Идея как их отмечать на стороне еластика: иметь в документе поле например USERID_VIEW и добавлять в него ID пользователей которые отметили этот документ, ну и в поиске игнорировать доки которые содержат ID пользователя в USERID_VIEW .

Идея не очень хорошая. Потому что ...
Будет ли еластик держать в поле список 100K+ значений?

Нет, не будет.

Предложить можно следующее:
- держать список просмотренных пользователем документов отдельно от эластика, в отдельной базе (можно использовать какое нибудь KV-хранилище или просто SQL-базу)
- просмотренные документы дополнительно фильтровать программно по этому списку
- если просмотренных документов мало, то вставлять их в запрос на исключение
- или держать короткий список просмотренных документов, например 100-200 позиций, или формировать его, например по дате, и вставлять в запрос
Ответ написан
Revencu
@Revencu Автор вопроса
В общем, я попробовал использовать
{"must_not": {"terms": {"_id": [...]}}}
где список ID документов был 200K и запрос прошел успешно (конечно увеличил лимит для terms)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
от 300 000 до 500 000 ₽
от 1 000 000 до 1 200 000 ₽
Сима-ленд Екатеринбург
от 120 000 до 250 000 ₽
23 апр. 2024, в 19:21
300 руб./за проект
23 апр. 2024, в 19:05
15000 руб./за проект
23 апр. 2024, в 18:47
10000 руб./за проект