Структура данных для быстрого полнотекстового поиска

Кажется, что trie будет работать для небольших строк, но не для больших документов, поэтому не уверен (1-100 страниц текста). Возможно, можно объединить инвертированный индекс с суффиксным деревом, чтобы получить лучшее из обоих миров. Или, возможно, используя b-дерево со словами, хранящимися в виде узлов, и деревом для каждого узла. Точно сказать не могу. Интересно, какой была бы хорошая структура данных (b-дерево, связанный список и т. д.).

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

Взгляните на здесь, он обсуждает некоторые основы, но также перечисляет ряд решений с открытым исходным кодом (lucene, solr, ...)

TilmannZ 02.05.2018 12:29

Если вы хотите поддерживать приблизительный поиск (опечатки и т. д.), Стандартным подходом, вероятно, будет н-граммы. Здесь - программа просмотра n-граммов Google.

TilmannZ 02.05.2018 12:33
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
5
2
3 063
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Чтобы оптимизировать использование памяти, вы можете использовать оптимизированные для памяти версии Trie, такие как Радиксное дерево или Адаптивное радиксное дерево (ART). Я добился большого успеха, используя ART для проекта нечеткой поисковой системы с открытым исходным кодом, над которым я работал: https://github.com/typesense/typesense

С помощью Typesense я смог проиндексировать около 1 миллиона заголовков Hacker News примерно в 165 МБ ОЗУ (несжатый размер на диске был 85 МБ). Вероятно, вы можете втиснуть его еще больше, если ваш вариант использования более конкретен и не требует некоторых полей метаданных, которые я добавил в структуру данных.

Другие вопросы по теме