Какой метод поиска самый быстрый? (В контексте поиска файлов) - PullRequest
8 голосов
/ 12 сентября 2009

Я не знаю, что они используют при обычном поиске Windows. Но есть методика, при которой вы используете индексацию файлов сразу, а затем используете индекс позже для более быстрого поиска. (Например, поиск Windows 4.0)

Есть ли другой способ для более быстрого поиска, чем этот? Можете ли вы уточнить с точки зрения реализации? (Предполагая, что мне может понадобиться это реализовать)

Чтобы было проще понять, позвольте мне сказать это так:

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

Мой вопрос: какие возможные варианты / способы / подходы доступны для создания такого приложения? (и которые быстрее, чем существующие.)

(Можно ли использовать метод бинарного дерева поиска?)

Ответы [ 8 ]

22 голосов
/ 20 сентября 2009

В основном для полнотекстового поиска по большим корпусам используются два метода: размещение списков и суффиксных массивов.

Список проводок - это список пар (term, document_id), необязательно с позицией в документе. Если вы сортируете или хешируете по термину, у вас есть эффективный для поиска полнотекстовый индекс.

Существуют различные способы сделать списки рассылки меньше, быстрее получать доступ, быстрее обновлять и более гибкие, некоторые за счет точности. Lucene, вероятно, является лучшим из доступных на сегодняшний день текстовых индексаторов на основе списков публикаций, и (в отличие от ваших предыдущих комментариев) может индексировать текст, найденный в файлах PDF, Microsoft Word и т. Д. Проект Lucene.net , связанный Томасом Майерхофером, выглядит довольно разумным портом, хотя, конечно, вы всегда будете немного отстать от переднего края того, что происходит в версии Java.

Для корпуса, который намного больше, чем память, вы в значительной степени должны хранить список сообщений на диске. Это препятствует использованию простого бинарного дерева поиска для доступа к нему: если у вас есть сто тысяч документов по десять тысяч слов каждый, у вас есть миллиард сообщений, что означает, что ваше двоичное дерево поиска имеет минимальную глубину 30. Проблема в том, что что 30 узлов на пути от корня дерева к листу, как правило, будут расположены в разных частях вашего диска - поэтому диск должен искать 30 раз, чтобы найти записи для одного термина! Это примерно 2,5 секунды, что слишком медленно.

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

В качестве примера уменьшения списков рассылки за счет точности книга Managing Gigabytes (и проект mg4j ) имеет структуру данных, называемую «подписанная минимальная совершенная хеш-таблица», которая не на самом деле хранятся индексируемые термины - только их хеши. Таким образом, существует небольшая вероятность ложного положительного результата - вам нужно извлечь документы, которые предположительно содержат термин, чтобы подтвердить, что они действительно есть.

Суффиксные массивы, которые являются гораздо более компактной и немного более медленной версией радикальных деревьев (то есть попыток), реализованы GLIMPSE и несколькими другими программами, но в настоящее время они в основном перестали использоваться. Они обладают некоторой гибкостью, отсутствующей в структуре данных списка публикаций - например, они позволяют осуществлять поиск по регулярному выражению и поиск с ошибками, но они не такие быстрые. Недавно была проведена работа с преобразованием Барроуза-Уилера, которое основано на массивах суффиксов и предоставляет алгоритм сжатия, в котором сжатый файл представляет собой полнотекстовый индекс! Лучше всего документированная версия называется FM-index , хотя я слышал, что существуют более старые версии этой техники, возможно, неопубликованные. В отличие от других методов, описанных выше, однако, я думаю, что это на самом деле не работает, когда документы представляют собой PDF-файлы или что-то в этом роде - вы все равно можете использовать тот же подход для извлечения текстовой версии каждой страницы и индексации, но вы этого не делаете получит преимущество сжатия оригинального документа.

Мой знакомый Тим написал действительно хорошую вводную серию публикаций в блогах о поиске еще в 2003 году, которые все еще довольно хороши. Они охватывают этот материал (за исключением недавних разработок) гораздо глубже.

Рави: Это та информация, которую вы ищете?

Редактировать: спасибо за исправление моего форматирования, Мартин!

14 голосов
/ 12 сентября 2009

Взгляните на Lucene . Это супер быстрая библиотека для поиска текста (файлов). Также доступно Lucene.NET . Если вы хотите реализовать это самостоятельно, это хорошая отправная точка и ориентир для вашей реализации.

2 голосов
/ 12 сентября 2009

Вы ищете только имена файлов или хотите посмотреть и содержимое? На каком языке вы хотите это реализовать?

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

Он по-прежнему требует, чтобы вы открывали каждый файл, пока не найдете то, за чем следите.

1 голос
/ 20 сентября 2009

Нет единой техники или «серебряной пули». Но если вы начнете с нуля, лучше grok , это и , это стандартный текст по теме.

1 голос
/ 20 сентября 2009

Вы можете использовать поиск knuth-morris-pratt или boyer-more, который очень быстрый и вам не нужен индекс.

1 голос
/ 18 сентября 2009

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

Кроме того, проблема больше подходит для (radix) три. Смотрите википедию.

1 голос
/ 18 сентября 2009

Полнотекстовый поиск. Представьте, что у вас есть словарь слов, и для каждого слова вы записываете, какой документ содержит слово и точное местоположение слова в этом документе. Это называется полнотекстовым индексом и позволяет выполнять такие операции, как логический поиск и сопоставление точной фразы. Полнотекстовая индексация может легко масштабироваться до миллионов документов, и это то, что обычно использует Windows Search 4.0. Смотрите также Люцен или Сфинкс.

Концептуальный поиск: Концептуальный поиск позволяет вводить несколько релевантных слов (или даже целый документ) и возвращать документы, которые наиболее похожи на ваш ввод. Основываясь на вашей коллекции документов, он создает концептуальные пространства, которые позволяют выводить семантические связи между словами. Это позволяет ему возвращать более релевантные результаты поиска, потому что компьютер «понимает» понятия, которые вы ищете, и будет сопоставлять концептуально похожие слова и фразы. Это то, что обычно используют решения корпоративного поиска и eDiscovery. Продукты, которые предлагают концептуальный поиск, включают Engenium и Autonomy.

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

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

0 голосов
/ 20 сентября 2009

Возможно, вы сможете адаптировать PigeonRank ™ к вашим потребностям:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...