Быстрый инвертированный индекс в памяти - PullRequest
6 голосов
/ 07 июля 2011

Я ищу быструю реализацию в памяти общего инвертированного индекса.Все, что мне нужно, это хранить объекты с весами для пары миллионов объектов и использовать инвертированный индекс для вычисления сходств между объектами, используя различные функции расстояния.

Все остальные атрибуты объектов, которые я могу хранить в некотором быстром хранилище значений ключей.

Я надеялся, что смогу использовать Lucene просто в качестве инвертированного индекса, но не могу понять, как я могу связать с документом свой собственный вектор пользовательских элементов с предварительно вычисленными весами.Любые рекомендации будут высоко оценены!

Спасибо.

Ответы [ 4 ]

4 голосов
/ 24 мая 2012

Я выполнял аналогичную работу и обнаружил, что redis 'zset - это почти то, что мне нужно (хотя я на самом деле не использую его сейчас; я развернул свое собственное решение на основе файлов с отображенной памятью).По сути, zset - это отсортированный набор пар ключ-значение.Таким образом, вы можете иметь отсортированный набор для каждой функции, где каждыйfeature -> [{docid, Score}, {docid, Score} ..]т.е.задд художественный балл docidЗатем в redis есть несколько хороших операторов для слияния, извлечения диапазонов и т. д. См. zunionstore, zrange (http://redis.io/commands/zunionstore).
Очень быстро (предположительно) и все в памяти и т.д ... (хотя redis не является встроенной БД).

1 голос
/ 31 июля 2011

Вы смотрели на терьера ? Я не совсем уверен, что он имеет индексы в памяти, но он гораздо более расширяем в отношении индексации и оценки, чем Lucene.

0 голосов
/ 06 марта 2012

Если пары объектов, которые вы хотите сравнить, уже указаны заранее, и вас интересуют парные оценки, я не думаю, что Lucene даст вам какое-либо преимущество. Просто найдите векторы в некотором хранилище значений ключей и вычислите сходство. Рассмотрите возможность использования разреженного векторного представления для эффективности пространства и времени.

Если заранее указана только одна сущность, и вас больше интересует сценарий, подобный ранжированию, возможно, стоит попробовать Lucene. Правильное место для просмотра будет

org.apache.lucene.search.Similarity

вы должны быть в состоянии адаптировать его к вашим потребностям и установить вашу версию по умолчанию с помощью

setDefault(Similarity similarity) 

Однако я был бы осторожен с ожиданиями увеличения скорости (с повторением всех), поскольку они в значительной степени зависят от разреженности (запроса) и функции оценки, которую вы выбираете для реализации. Также обратите внимание, что Lucene использует двухэтапную схему извлечения, сначала логическое значение («все условия AND содержали? Какие-либо из условий OR?»), А затем оценивается, что проходит. В то время как для tf.idf вы ничего не потеряете на пути к другим функциям скоринга, которые вы могли бы.

Для более общих подходов для эффективного приближенного поиска ближайшего соседа, возможно, стоит взглянуть на LSH:

http://en.wikipedia.org/wiki/Locality-sensitive_hashing

0 голосов
/ 17 сентября 2011

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

...