LINUX.ORG.RU

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

 


0

1

Связано с Как реализовать «подписку на поисковый запрос»?, подписками на поисковые запросы.

Допустим есть куча документов с массивами слов (тегов):

- A, B
- D, E, F,
- C, B, A

И т.д. слова и их комбинации произвольные.

И есть строка (заголовок темы) из слов [ x, y, z, ... ]. Как выбрать документы, все слова которых полностью подержатся в заголовке?

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

★★★★★

Не знаю что такое монга, но в реляционной модели это хотя бы выразимо. Если есть отношение doc (docid, ...) и отношение doctag (docid, tag), а искомый заголовок с разбивкой по словам в виде отношения word (word), то надо выбрать документы, у которых количество тегов совпадает с количеством тегов из множества слов.

select d.*
from doc d
where (select count(1)
       from doctag t
       where t.docid=d.docid) =
      (select count(1)
       from doctag t, word w
       where t.docid=d.docid
       and t.tag=w.word)

В реальной рсубд конечно потребуется фуллскан по внешней таблице doc, но все джойны вполне выполнимы нестед лупами, так что памяти много не надо, и первые результаты можно получить из курсора до окончания фуллскана.

iliyap ★★★★★
()
Последнее исправление: iliyap (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.