Как мне отфильтровать / отсортировать упорядоченный документ, который принадлежит нескольким категориям в Solr, без группировки?

#lucene #solr #indexing #schema

#lucene #solr #индексирование #схема

Вопрос:

Я ищу некоторую помощь и советы о том, как правильно спроектировать схему индексирования документов для моей ситуации. В основном у меня есть продукты, которые могут принадлежать к нескольким категориям. В этих категориях эти продукты могут быть упорядочены или не упорядочены. В идеале я хотел бы сохранить только один уникальный документ для каждого продукта.

Я использую Solr 3.4.0 и в настоящее время имею документы с такой структурой:

 {
    productId : "1",
    sku : "ABC123",
    productName : "My Product",
    categorySequence : ["123-1", "456-7", "789-noseq", "000-noseq"],
    description : "Product description",
    rating: "4.36"
}
  

У меня возникли проблемы с categorySequence. Это многозначное поле, которое содержит строки, отформатированные с идентификатором категории и последовательностью моего продукта в пределах этого идентификатора категории, разделенных тире. В тех случаях, когда продукт не упорядочен в категории, я произвольно добавил «noseq».

Поскольку мой продукт может существовать в нескольких категориях, я выполняю запрос фильтра в поле categorySequence следующим образом:

 fq=categorySequence:123-*
  

который помогает мне возвращать только те продукты, которые находятся в категории с идентификатором «123».

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

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

Я надеюсь придерживаться одного документа, представляющего один продукт. Может кто-нибудь помочь мне указать правильное направление? Я предполагаю, что я в основном смотрю на выполнение фильтра и сортировки по двумерному полю?

Ответ №1:

Столкнулся с аналогичной проблемой, и вот что мы реализовали —

  1. Создайте динамическое поле для каждого продукта, включающее идентификатор продукта и последовательность сортировки.

Поле —

 <dynamicField name="*_sort_seq"  type="string"  indexed="true"  stored="false"  sortMissingLast="true"/> 
  

данные, переданные в Solr —

 123_sort_seq=1
456_sort_seq=7
  
  1. Не нужно хранить документы без какой-либо последовательности сортировки. Их позиции можно обрабатывать с помощью атрибутов sortMissingLast и sortMissingFirst.

  2. Эти поля будут сохранять положение / последовательность продуктов для категорий.

  3. Поскольку вы знаете идентификатор категории, вы можете легко фильтровать и сортировать по продуктам.

    fq=categorySequence:123-*amp;sort=123_sort_seq asc

  4. Не нужно будет поддерживать несколько копий продуктов.

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

1. Это определенно более краткий путь, спасибо за такой подход!