Lucene SimpleFacetedSearch Количество граней превысило 2048 - PullRequest
3 голосов
/ 01 марта 2012

Я столкнулся с проблемой, связанной с использованием Lucene.net в одном из моих проектов, где я использую функцию SimpleFacetedSearch, чтобы выполнить фасетный поиск.

Я получаю исключение

Число граней превышено 2048

У меня есть 3 столбца, с которыми я сталкиваюсь, как только добавляю другой фасет, я получаю исключение.

Если я удаляю все остальныефасеты новый фасет работает.

Детализация до источника SimpleFacetedSearch Я вижу внутри конструктора SimpleFacetedSearch, что проверка количества фасетов не превышает MAX_FACETS, который является константой, равной 2048.

  foreach (string field in groupByFields)
  {
    ...
    num *= fieldValuesBitSets1.FieldValueBitSetPair.Count;
    if (num > SimpleFacetedSearch.MAX_FACETS)
        throw new Exception("Facet count exceeded " + (object) SimpleFacetedSearch.MAX_FACETS);
    fieldValuesBitSets.Add(fieldValuesBitSets1);
    ...
  }

Однако, так как он общедоступен, я могу установить его следующим образом.

SimpleFacetedSearch.MAX_FACETS = int.MaxValue;

Кто-нибудь знает, почему он установлен на 2048 и если есть проблемы с его изменением?Мне не удалось найти какую-либо документацию по нему.

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Нет, не должно быть никаких проблем при его изменении.Но помните, что использование Bitsets (как это делается внутри SimpleFacetedSearch) более эффективно, когда результаты поиска велики, но число фасетов не превышает некоторого числа.(Скажем, 1000 граней 10M хитов)

Если у вас гораздо больше граней, но результаты поиска невелики, вы можете перебирать результаты (в коллекторе) и создавать фасеты.Таким образом, вы можете получить лучшую производительность.(скажем, 100K граней 1000 хитов)

Итак, 2048 может быть оптимизированным числом, превышение которого может привести к потере производительности.

1 голос
/ 24 ноября 2012

Проблема, которой MAX_FACETS следует избегать, связана с использованием памяти и производительностью.Внутренне SimpleFS использует растровые изображения для записи, в каких документах используется каждое значение фасета. Для каждого документа есть бит, и у каждого значения есть отдельное растровое изображение.Поэтому, если у вас много значений, необходимый объем памяти быстро растет, особенно если у вас также много документов.память = значения * документы / 8 байт.

У моей компании есть индексы с миллионами документов и десятками тысяч значений, для которых потребуется много ГБ памяти.

Я создал еще одну реализацию,Я позвонил SparseFacetedSearcher.Это записывает идентификаторы документов для каждого значения.Таким образом, вы платите только за хиты, а не бит за документ.Если в каждом документе имеется ровно одно значение (например, категория продукта), то точка безубыточности - это если у вас более 32 значений (более 32 категорий продуктов).В нашем случае использование памяти сократилось до нескольких 100 МБ.

Не стесняйтесь взглянуть на https://github.com/Artesian/SparseFacetedSearch

...