Как ограничить результаты с одним и тем же значением поля количеством документов X каждый раз, когда он появляется несколько раз подряд - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть проблема, которую я не совсем знаю, как решить. Очень надеюсь, что кто-то здесь может помочь мне разобраться, как go об этом.

Представьте, что у меня есть 100 документов, все с полями user_id. Я знаю, что большинство документов принадлежат разным user_id, но документы 1-10 и 20-29 принадлежат одному и тому же user_id.

Что я хочу сделать, так это убедиться, что я вижу только последние два документа всякий раз, когда a один и тот же user_id возвращается подряд более двух раз. Так что если user_id 1 появляется более двух раз подряд, я хочу ограничить эти документы. Я хочу, чтобы это происходило каждый раз, когда это происходит для этого user_id, а не ограничивало его полностью после этого.


Если бы я просто запросил все документы, так как они сейчас проиндексированы, я бы получил такой результат: *

[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 , 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 , ...]


Что я облажаю Ибо мы можем убедиться, что эти группы единиц ограничены двумя документами подряд, например:

[ 1, 1 , 2, 3, 4 , 5, 6, 7, 8, 9, 10, 11, 1, 1 , 12, ...]

Обратите внимание, что здесь происходит 1, 1, ..., 1, 1, ..., что означает, что строки идентичных пользовательских идентификаторов были сокращены до двух вместо удаления их всех вместе, что привело бы к чему-то вроде:

[ 1, 1 , 2, 3 , 4, 5, 6, 7, 8, 9, 10, 11, 12, ...]


Я также хочу, чтобы это работало, если запрос разбит на страницы (несколько запросов) ,

Итак, представьте, что я запрашиваю первые две страницы размером 5, а затем хочу получить:

Page1: [1, 1, 2, 3, 4 ]

Страница 2: [5, 6, 7, 8, 9]

Вместо:

Страница 1: [ 1, 1, 2, 3, 4]

Page2: [1, 1, 1, 1, 1]


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

1 Ответ

1 голос
/ 04 февраля 2020

Вы описали проблему хорошо и понятно.

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

Решение

GET /myindex/_search
{
  "from": 10,
  "size": 10,
  "query": {
    "match": {
       "<my_field>": "<my_search_terms>"
    }
  },
  "collapse" : {
    "field" : "user_id",
    "inner_hits": {
        "name": "last_two_documents_per_user", 
        "size": 2,
        "sort": [{ "<my_timestamp_field>": "desc" }] 
    },
    "max_concurrent_group_searches": 4
  },
  "sort": ["<my_timestamp_field>"], 
}

(см. Elasticsearch Ссылка: Разрушение поля )

...