#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 кортежей.