Добавление к приложению полнотекстового индексирования
Поиск. Все используют его ежедневно и не по одному разу в день. В вебе его использовали уже много лет, и теперь мы ожидаем, что он будет везде.
Итак, вы разработчик и хотите встроить полнотекстовую индексацию и поиск в свои приложения. Но вы не хотите зависеть от чего-то, что должно локально устанавливаться и настраиваться, вроде Windows Search. Вы полазили по Сети и нашли несколько библиотек, но они слегка превышают ваши потребности.
К тому же, будучи кодером, вы хотели бы понять, как работают полнотекстовое индексирование и поиск (когда у вас есть несколько свободных циклов, чтобы разобраться в этом). Поэтому вам нужна статья с описанием деталей, пример приложения и механизм, который можно встроить в приложение вместе с исходными текстами.
Это не всё, что могло бы быть...
hOOt – механизм полнотекстового поиска
hOOt – крайне компактный и быстрый встраиваемый механизм полнотекстового поиска для .NET построенный с нуля, используя инвертированный битовый индекс WAH. Большинство знакомо с проектом Apache по имени Lucene.net, который является переносом оригинальной java-версии. Многие жаловались на то, что .NET-версия Lucene больше не поддерживается и существует множество неподдерживаемых портированных версий. Чтобы обойти это, я создал данный проект, который делает ту же работу, но является более компактным, простым и быстрым. .hoot – часть моего выходящего проекта хранилища документов RaptorDB, и он оказался настолько успешным, что я решил выделить его в самостоятельный проект.
При создании hOOt использованы следующие статьи:
- BitArray сжатый по алгоритму WAH
- замена мини-log4net
- Хеш-индекс MurMur2 и файл хранилища из RaptorDB
- Сериализатор fastJSON
- IFilter без COM
Основываясь на откликах и отзывах пользователей этого проекта, я обновил и усовершенствовал 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 в приложениях;
И лучше всего, в ней рассказывается, как это все работает, как строятся индексы, как сохраняются результаты и происходит поиск.
Итак, вы ждете много кода, правильно? Развесистого проекта?
Нет.
Размер zip-файла с исходным кодом и приложением составляет всего 57 к.
Вот снимок решения (как он есть)
Проект работает, как и полагается. В качестве метафайла я использовал hOOt чтобы проиндексировать hOOt…
Так, что если вы когда-нибудь думали, что вашему приложению было бы полезно иметь полнотекстовую индексацию и поиск, но существующие библиотеки не удовлетворяли вас, и вы не хотите зависеть от решений сторонних фирм, то можете надеяться на hOOt…
Comments
Anonymous
November 10, 2011
Не понятно какие языки он поддерживает? Интересует например польский.Anonymous
November 12, 2011
Это не понятно и когда читаешь исходное сообщение. На вопрос можно ответить только попробовав самостоятельно создать макет приложения с hoot