Потребление памяти Lucene.Net и медленный поиск, когда используется слишком много предложений - PullRequest
1 голос
/ 18 июня 2010

У меня есть БД, имеющая атрибуты текстового файла и идентификаторы первичного ключа текстового файла и проиндексированная около 1 миллиона текстовых файлов вместе с их идентификаторами (первичные ключи в БД).

Теперь я ищу на двух уровнях.Во-первых, это прямой поиск в БД, где я получаю первичные ключи как результат (примерно 2 или 3 миллиона идентификаторов)

Затем я делаю логический запрос, например, как

+ Text:"test *" + (pkID: 1 pkID: 4 pkID: 100 pkID: 115 pkID: 1041 ....)

и найдите его в моем файле индекса.

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

Есть ли какое-либо решение для оптимизации этой проблемы?

Ответы [ 2 ]

2 голосов
/ 18 июня 2010

Предполагая, что вы можете повторно использовать часть dbid ваших запросов:

  1. Разделите запрос на две части: одна часть (текстовый запрос) станет запросом, а другая часть (запрос pkID)станет фильтром
  2. Сделать обе части в запросах
  3. Преобразовать запрос pkid в фильтр (с помощью QueryWrapperFilter)
  4. Преобразовать фильтр в кешированный фильтр (используя CachingWrapperFilter)
  5. Держитесь за фильтр, возможно, через какой-то словарь
  6. В следующий раз, когда вы выполните поиск, используйте перегрузку, которая позволяет использовать запрос и фильтр

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

HTH


ps

Думаю, было бы упущением с моей стороны не заметить, что я думаю, что вы подвергаете свой индекс всем видам злоупотреблений, используя его вот так!

1 голос
/ 09 июля 2010

Лучшая оптимизация - НЕ использовать запрос с 2 миллионами предложений.Любой запрос Lucene с 2 миллионами предложений будет выполняться медленно независимо от того, как вы его оптимизируете.

В вашем конкретном случае, я думаю, будет гораздо практичнее сначала выполнить поиск в индексе с помощью запроса +Text:"test*", а затем ограничить результаты, выполнив запрос к базе данных для обращений Lucene.

...