Как добиться опции DISTINCT в запросе tarantool

Статьи анализируются из RSS-канала, и каждая статья может относиться ко многим категориям. Кроме того, каждая статья имеет некоторые метаданные, такие как источник, основной поток и т. д.

Ниже показано, как мы разрабатываем пространства. Каждая статья вставляется в пространство статей.


место для статей

хеш-адрес | article.content
abcdef | { фиктивный контент}

URL-адрес первичного ключа = хэш (статья.url).


В поле category_articles мы вставляем статью несколько раз в зависимости от того, к скольким категориям она относится.

категория_статей

источник | категория | URL-адрес | отметка времени
bbc | искусство | статья1 | 27777
BBC | мобильный | статья8 | 27777
BBC | телефон | статья3 | 27778
новая | звук | статья7 | 36667
новая | динамик | статья7 | 45556

первичный ключ = {источник, категория, urlhash}
вторичный ключ = {источник, категория, отметка времени}

Мне нужны последние статьи для данного источника и возможной категории. Ниже показано, как я сформулировал запрос.

box.space.category_articles.index.secondary:select{{'nyt','speaker'},{ iterator = 'LE', limit = 5 }}

Теперь я получу в результате article7 дважды. В настоящее время я фильтрую повторяющиеся результаты в коде. Как я могу иметь отдельный тип (urlhash) в tarantool.


person crackerplace    schedule 19.04.2017    source источник


Ответы (2)


Мне удалось найти лучшее решение, используя функцию пар в индексе, а затем отфильтровать статьи (отследить уникальные с помощью таблицы lua), пока я не получу уникальное количество статей.

index_object:pairs([key[, iterator-type] ])

person crackerplace    schedule 13.07.2017

Где два возможных варианта

  1. Первый фильтрует все на стороне клиента.
  2. Второй использует хранимую процедуру Lua. Пример:

    функция select_with_distinct() local ca = box.space.category_articles для _, v в парах (ca.index.secondary: select{{'nyt','speaker'},{iterator = 'LE', limit = 5 }}) делать -- фильтрация ... конец конец

person Vasiliy Soshnikov    schedule 18.05.2017
comment
Да, но это все еще ограничено в том смысле, что из 5 статей, возвращенных для limit=5, у нас может быть много дубликатов. Я искал лучший способ указать ограничение для уникальных статей. - person crackerplace; 13.07.2017