Кэширование Lucene.net Результаты поиска


Я использовал Lucene.net реализовать функцию поиска (как для содержимого базы данных, так и для загруженных документов) на нескольких небольших веб-сайтах без проблем. Теперь у меня есть сайт, где я индексирую 5000+ документов (в основном PDF-файлы), и запросы становятся немного медленными.

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

Правка:

Тупая ошибка пользователя, ответственная за медленный запрос. Я создавал основные моменты для всего набора результатов сразу, а не только для "страницы", которую я показывал. Ой.

4   5   2009-02-02 22:38:27

4 ответа:

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

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

Кстати, документы Java (я нашел) так же применимы к версии .net.

Дополнительную информацию о вашей проблеме смотрите здесь: http://wiki.apache.org/lucene-java/ImproveSearchingSpeed

Lucene использует свой собственный внутренний механизм "кэширования", чтобы сделать поиск индекса быстрой операцией. Хотя я не думаю, что кэширование-это ваша проблема.

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

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

Во-первых, сам Lucene поддерживает версию каталогов в памяти:

Lucene.Net.Store.RAMDirectory

Вы можете использовать его следующим образом:

RAMDirectory idx = new RAMDirectory();

// Make an writer to create the index
IndexWriter writer =
    new IndexWriter(idx, new StandardAnalyzer(), true);

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

Я предпочитаю вышеупомянутый. Создайте проект webservice или service, который оборачивается вокруг магазина Lucene, используя RAMDirectory. Таким образом, вы можете выгрузить веб - сервис на другой сервер с большим количеством оперативной памяти, если индекс огромен-и получить почти мгновенные результаты.

Обязательно оптимизируйте свои индексы.

Кроме того, это быстрый/простой/эффективный способ реализации кэширования: HttpRuntime.Кэш.Добавлять(...);

Вы можете использовать ASP.Net кэш из любого типа проекта / библиотеки.