Эффективный способ ранжировать результаты поиска, используя инвертированный индекс - PullRequest
2 голосов
/ 09 октября 2011

Мой инвертированный индекс выглядит так:

token_word | DocId, положение; DocId, положение; DocId позиция;

В алгоритме для ранжирования, когда они запрашивают фразы, я открываю данные корзины для каждого слова, а затем ищу последовательные совпадения позиций, которые будут ранжироваться выше, это просто простой рейтинг релевантности. Проблема в том, что мне нужно проверить ВСЕ результаты в алгоритме, чтобы отсортировать их по «рейтингу», даже если я показываю только 10 на страницу.

Кто-нибудь знает способ решить это? Может быть, мне нужно ранжировать docid в самом индексе?

1 Ответ

4 голосов
/ 09 октября 2011

В дополнение к подходу token_word | docid,position;docid,position;docid,position; я предлагаю добавить запись token_word | docid,frequency;docid,frequency;docid,frequency;.

Таким образом, вы должны рассмотреть документ только один раз при ответе на запрос. Это может увеличить предварительную обработку, но уменьшить ненужные накладные расходы, когда пользователь запрашивает.

У вас могут быть проблемы с несколькими запросами по словам (т.е. почти все запросы), поэтому используйте docid,position подход для некоторых результатов, которые близки или связаны

Что бы я сделал, если бы вы были на вашем месте: поскольку вы показываете 10 результатов на странице, я бы проиндексировал все документы в соответствии с частотой, а затем проиндексировал только первые 10 для первой страницы в соответствии с положением. Затем сделайте то же самое для второй страницы, если пользователь переместится туда.


Недостатком этого подхода является то, что иногда первые несколько результатов на странице n + 1 могут оказаться лучше, чем последние несколько на странице n .

...