Freigeben über


Добавление к приложению полнотекстового индексирования

Грэг Дункан

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

Итак, вы разработчик и хотите встроить полнотекстовую индексацию и поиск в свои приложения. Но вы не хотите зависеть от чего-то, что должно локально устанавливаться и настраиваться, вроде Windows Search. Вы полазили по Сети и нашли несколько библиотек, но они слегка превышают ваши потребности.

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

Это не всё, что могло бы быть...

hOOt – механизм полнотекстового поиска

hOOt – крайне компактный и быстрый встраиваемый механизм полнотекстового поиска для .NET построенный с нуля, используя инвертированный битовый индекс WAH. Большинство знакомо с проектом Apache по имени Lucene.net, который является переносом оригинальной java-версии. Многие жаловались на то, что .NET-версия Lucene больше не поддерживается и существует множество неподдерживаемых портированных версий. Чтобы обойти это, я создал данный проект, который делает ту же работу, но является более компактным, простым и быстрым. .hoot – часть моего выходящего проекта хранилища документов RaptorDB, и он оказался настолько успешным, что я решил выделить его в самостоятельный проект.

При создании hOOt использованы следующие статьи:

Основываясь на откликах и отзывах пользователей этого проекта, я обновил и усовершенствовал hoot для достижения полной совместимости с lucene.net.

...

Зачем еще один полнотекстовый индексатор?

Я всегда восхищался тем, как ищет Google и техникой индексирования Lucene, а также их внутренними алгоритмами, но им очень сложно следовать, и всякий, кто работал с lucene.net подтвердит, что это сложный и запутанный кусок кода. Хотя некоторые и пытаются создать версию, более оптимизированную для .NET, реально это не так просто сделать, основываясь на данной кодовой базе. Что меня поражает, так это то, что никто не переписал ее с нуля. .hoot намного проще и быстрее по сравнению с lucene.net.

Одной из причин создания .hoot стала реализация полнотекстового поиска в строковых столбцах базы данных RaptorDB – версии хранилища документов. Надеюсь многие смогут использовать и расширить .hoot вместо lucene.net потому что его значительно проще понять и изменить.

Возможности

hOOt создавался, чтобы обеспечить следующие возможности:

  • Очень высокая скорость выполнения операций (см. Секцию тестирования производительности).
  • Невероятно малый объем кода.
  • Использование сжатых по алгоритму WAH массивов BitArrays для хранения информации.
  • Многопоточная реализация, означающая, что можно создавать запросы пока идет индексирование.
  • Компактный размер DLL (38 кБ. lucene.net – порядка 300 кБ).
  • Сильнооптимизированное хранилище, обычно на ~60% меньше, чем lucene.net (чем больше разница в индексе, тем значительнее различие).
  • Строки запросов разделяются на части с помощью оператора AND (т.е. все слова должны присутствовать).
  • В запросах поддерживаются специальные символы (*,?).
  • Операции OR выполняются по умолчанию (как в lucene).
  • Операции AND требуют префикса (+) (как в lucene).
  • Операции NOT требуют префикса (-) (как в lucene).

...

Статья продолжается и описывает, как использовать hOOt в приложениях;

clip_image002

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

clip_image004

Итак, вы ждете много кода, правильно? Развесистого проекта?

Нет.

Размер zip-файла с исходным кодом и приложением составляет всего 57 к.

Вот снимок решения (как он есть)

clip_image006

Проект работает, как и полагается. В качестве метафайла я использовал hOOt чтобы проиндексировать hOOt…

clip_image008

Так, что если вы когда-нибудь думали, что вашему приложению было бы полезно иметь полнотекстовую индексацию и поиск, но существующие библиотеки не удовлетворяли вас, и вы не хотите зависеть от решений сторонних фирм, то можете надеяться на hOOt…

Comments

  • Anonymous
    November 10, 2011
    Не понятно какие языки он поддерживает? Интересует например польский.

  • Anonymous
    November 12, 2011
    Это не понятно и когда читаешь исходное сообщение. На вопрос можно ответить только попробовав самостоятельно создать макет приложения  с hoot