Кеширование результатов поиска Lucene.net - PullRequest
5 голосов
/ 02 февраля 2009

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

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

Edit:

Глупая ошибка пользователя, ответственная за медленный запрос. Я создавал блики сразу для всего набора результатов, а не только для «страницы», которую я отображал. К сожалению.

Ответы [ 4 ]

5 голосов
/ 03 марта 2009

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

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

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

Подробнее о вашей проблеме см. Здесь: http://wiki.apache.org/lucene-java/ImproveSearchingSpeed

1 голос
/ 01 марта 2013

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

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

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

1 голос
/ 20 февраля 2009

Во-первых, сама 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, которая кеширует наиболее распространенные для вас результаты на основе ключевых слов, очевидно.

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

1 голос
/ 03 февраля 2009

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

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

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

...