Который является самой быстрой поисковой техникой/методом? (В контексте поиска файла)

Я использовал бы код в исходном вопросе, но если Вы действительно хотели использовать foreach и иметь целочисленный индекс в C#:

foreach (int i in Enumerable.Range(0, myArray.Length).Reverse())
{
    myArray[i] = 42; 
}
8
задан Pale Blue Dot 16 September 2009 в 16:32
поделиться

8 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

22
ответ дан 5 December 2019 в 04:46
поделиться

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

14
ответ дан 5 December 2019 в 04:46
поделиться

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

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

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

2
ответ дан 5 December 2019 в 04:46
поделиться

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

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

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

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

Это то, что обычно используют решения корпоративного поиска и обнаружения электронных данных. Продукты, предлагающие концептуальный поиск, включают Engenium и Autonomy.

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

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

Это то, что обычно используют решения корпоративного поиска и обнаружения электронных данных. Продукты, предлагающие концептуальный поиск, включают Engenium и Autonomy.

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

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

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

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

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

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

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

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

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

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

1
ответ дан 5 December 2019 в 04:46
поделиться

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

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

1
ответ дан 5 December 2019 в 04:46
поделиться

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

1
ответ дан 5 December 2019 в 04:46
поделиться

Единственный способ, который я могу придумать, чтобы сделать то, что вы хотите, - это установить использование упаковки pom (или создать индивидуальную упаковку ) и связать требуемые цели из упаковки войны к соответствующим фазам жизненного цикла. Если вы выберете упаковку pom, вы можете использовать команду define the war: war execution в профиле, чтобы упаковать ее, но вам нужно будет использовать build-helper-maven-plugin цель attach-artifact прикрепить войну к помпу.

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

Привязки жизненного цикла для упаковки войны перечислены в Введение в Жизненный цикл сборки (см. Раздел «Привязки жизненного цикла по умолчанию - упаковка ejb / ejb3 / jar / par / rar / war»).

-1
ответ дан 5 December 2019 в 04:46
поделиться

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

1
ответ дан 5 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: