Как ограничить запрос фасета для получения определенного количества строк

#solr

Вопрос:

У меня есть хранилище Solr с огромным количеством документов. Вот пример структуры моего документа:

 {
        "country":"USA",
        "company":"Corsair",
        "product":"RM650X 650W",
        "price":"140",
        "on_stock":"yes"
},
 

Я хотел бы сделать фасетный запрос на данные Solr для получения определенного количества строк (например, 200).

Вот желаемый результат:

введите описание изображения здесь

Проблема в том, что я не могу правильно ограничить данные. В документации Solr говорится, что « facet.limit параметр определяет максимальное количество ограничений (по сути, количество возвращаемых фасетов для поля), которые должны быть возвращены для полей фасетов. Этот параметр может быть задан для каждого поля, чтобы применить отдельное ограничение к каждому полю с синтаксисом f.<fieldname>.facet.limit »

И здесь начинается самое сложное. Я попытался использовать ограничение в 200 для первого столбца (Страна / регион). Вот моя просьба:

  country:{
    type: terms,
    field: country,
    limit: 200, # Limit's here
    facet:{
      company:{
        type: terms, 
        field: company,
        limit: -1
        facet:{
          product:{
            type: terms, 
            field: product,
            limit: -1
         }
      }
    }
 

Этот запрос возвращает 200 результатов для аспекта страны, но поскольку в каждой стране разное количество вложенных компаний и у каждой компании разное количество вложенных продуктов, я получаю тысячи строк данных.

Затем я попытался использовать ограничение в 200 для последней колонки (Продукт). Вот моя просьба:

  country:{
    type: terms,
    field: country,
    limit: -1,
    facet:{
      company:{
        type: terms, 
        field: company,
        limit: -1
        facet:{
          product:{
            type: terms, 
            field: product,
            limit: 200 # Limit's here
         }
      }
    }
 

Этот запрос возвращает 200 результатов для каждого продукта, относящегося к каждой компании, относящейся к каждой стране. Другими словами, ограничение является локальным для каждой вложенной категории, а не глобальным. И снова я получаю тысячи строк данных.

Возможно ли достичь моей цели в Solr?

Комментарии:

1. Мне трудно понять проблему, так как аспекты генерируются на основе того, что является частью набора результатов для вашего запроса. Наличие фасета country должно дать вам представление о том, сколько документов имеет каждый семестр; что в этом непредсказуемого? Он должен соответствовать количеству документов, в которых указан этот термин. Если вы хотите ограничить его выборкой только 200 совпадающих строк, используйте rows=200 вместе с запросом, а если вы не хотите показывать фактический итог, отобразите 200 , если значение выше 200 .

2. @MatsLindh спасибо за ваш комментарий. Я обновил свой дескриптор и включил фрагменты кода для запросов, которые я использую. Что касается того rows=200 , как я должен передать этот параметр с помощью API фасета JSON?

3. Трудно понять, для чего вы хотите использовать результат такой грани; вы ищете 200 уникальных <country>_<company>_<product> комбинаций? Если это так, я думаю, вам придется создать поле специально для обработки такого рода запросов; но в этом случае, я предполагаю, что product в любом случае это будет доминирующим фактором. Если вам нужно всего 200 документов, вам вообще не нужно делать фасетирование, просто используйте rows=200 его для вашего основного запроса. Обычно люди хотят использовать грани, чтобы сузить результаты поиска по странам или компаниям в вашем случае.

4. @MatsLindh Я использую фасетный запрос, чтобы вычислить, сколько раз каждая уникальная комбинация <country>_<company>_<product> встречается в моих документах. Но мне нужно сделать этот расчет только для первых 200 уникальных комбинаций, а не для всех возможных уникальных комбинаций в моих данных. Я обновил иллюстрацию желаемого результата.

5. Идеальным решением было бы создать новое поле с тремя значениями, разделенными разделителем (например, | или _ ), переиндексировать содержимое, а затем выполнить его фасетирование. Тогда поле будет представлять собой один поиск для каждого уникального значения. Если вы не можете переиндексировать (что вы действительно, действительно должны легко сделать), другим вариантом может быть использование потокового выражения с тремя facet вызовами с ограничением 200 в качестве источников, затем используйте декораторы потоков для создания троек для каждого набора входных данных и окончательного ограничения для вывода только 200 кортежей.