solr география иерархия

Я пытался найти способ реализовать огранки с иерархиями в solr и не могу понять, как это сделать в моей ситуации. Я прочитал пару статей о создании иерархий в solr вместе с решениями в патчах 64 и 792. Основная проблема, с которой я столкнулся, заключается в том, что у меня есть сущности, которые могут принадлежать нескольким ветвям иерархии. Текущая форма моих данных — это пользовательский документ с MVA для страны, штата и города.

Возьмем, к примеру, географическую иерархию, в которой люди могут перечислять свои услуги вплоть до уровня города. Человек может обслуживать всю Алабаму, но только определенные города в Джорджии. Теперь счетчик граней для уровня штата подсчитывает отдельных лиц, которые обслуживают территорию, которая равна 1 для Алабамы и 1 для Джорджии, и при расширении до уровня города имеет количество для каждого города (другими словами, сумма городских счетчики не обязательно будут равны счетчику состояний, поскольку счетчики не являются взаимоисключающими).

США(1)
Грузия(1)
Атланта(1)
Колумбус(0)
Афины(0)
Алабама(1)
Мобильный телефон(1)
Бирмингем(1)
Хантсвилл(1)

Часть, на которой я зацикливаюсь, заключается в том, что когда я смотрю на города, у меня нет возможности узнать, к какому штату они принадлежат, поскольку пользователь указан как в Алабаме, так и в Джорджии, и я не могу найти способ связать атрибуты с каждым разное. solr-64 может работать, если он поддерживает несколько веток, таких как US/Alabama/Mobile/ и US/Georgia/Atlanta/, для одного и того же документа. На данный момент мне не удалось скомпилировать его с ночной сборкой, поэтому я немного застрял.

У кого-нибудь есть лучший способ сделать это?


person bcm6435    schedule 11.01.2011    source источник
comment
Чтобы уточнить, есть ли у вас документ для каждого города или один документ для каждой службы, в котором перечислены все города и штаты в документе?   -  person rfeak    schedule 12.01.2011
comment
Все предложения работают нормально, если пользователь принадлежит только к 1 ветке. Что происходит, если я выдаю запрос для facet.field=city, то города для обоих штатов отображаются без возможности группировать их в соответствии с их родительским штатом. Даже если я поворачиваюсь или группирую, он думает, что все города принадлежат каждому штату. Если я вставлю разделитель, как предложил rfreak, я смогу реконструировать дерево, но, похоже, это потребует большой обработки на стороне клиента, потому что он не будет автоматически сворачивать счетчики до уровня состояния.   -  person bcm6435    schedule 12.01.2011


Ответы (4)


См. описание первого варианта использования здесь. (необходима обработка на стороне клиента для индексации и запросов!)

Навигация по категориям

Проблема: у вас есть дерево категорий, и ваши продукты разбиты на несколько категорий.

Есть два относительно похожих решения этой проблемы. Опишу один из них:

  • Создайте многозначное строковое поле с именем «категория». Используйте идентификатор категории (или имя, если вы хотите избежать запросов к БД).
  • У вас есть дерево категорий. Убедитесь, что документ получает не только конечную категорию, но и все категории до корневого узла.
  • Теперь грань над полем категории с «-1» в качестве ограничения
  • Но что, если вы хотите отобразить только категории одного уровня? Например. если вы не хотите, чтобы другие уровни одновременно или если они слишком много.

    Затем проиндексируйте поле категории аля <level>_category. Для этого вам понадобится полное дерево категорий в оперативной памяти при индексировании. Затем используйте facet.prefix=<level>_ для фильтрации списка категорий по уровню.

  • Нажатие на запись категории должно привести к запросу фильтра аля fq=category:”<level>_categoryId”
  • Небольшая сложность заключается в том, что теперь ваш пользовательский интерфейс или средний уровень должны анализировать уровень, например. 2 и добавить 2+1=3 к запросу: facet.prefix=3_
  • Если фильтровать уровень, то остается один вопрос:

    В: как можно отобразить путь от выбранной категории до корневой категории?

    A: Либо получите родителей категорий через БД, что легко, если вы храните идентификаторы категорий в Solr, а не имена категорий. Или получить родителей из списка параметров, что немного сложнее, но выполнимо. В этом случае вам нужно будет сохранить имена категорий в Solr.

person Karussell    schedule 12.01.2011
comment
Думаю, я понимаю, о чем вы говорите, я делал что-то подобное до того, как разбил уровни на разные поля. Что происходит, когда продукт находится более чем в одной категории, и вы хотите фасетировать его на листья, но ограничить его только одной ветвью? Я не могу найти решение, которое даст мне перечисление и подсчет без включения листьев из другой ветки. Я могу сохранить его как значения идентификатора и вернуться к базе данных, чтобы найти родительскую категорию, чтобы отфильтровать нежелательные листья, но это также означает, что я должен обрабатывать подсчеты на стороне клиента. Может я что-то упускаю? - person bcm6435; 13.01.2011
comment
мы всегда сначала показываем корень (например, фильмы, книги, ...). Затем пользователь видит, в какие ветки он может попасть. - person Karussell; 13.01.2011
comment
(одна проблема с версткой: в посте убрали вещь level_category. Обновлено) - person Karussell; 13.01.2011
comment
что вы имеете в виду под «я должен обрабатывать подсчеты на стороне клиента»? - person Karussell; 13.01.2011
comment
Что касается фасета на листьях, но ограничьте его только одной ветвью -> вы фасетируете по level_categoryId, таким образом, вы отфильтровываете все остальные ветки. Или что ты имел в виду? - person Karussell; 13.01.2011

Я не очень знаком с вашей проблемой, но, похоже, вам нужно сделать группу по городам, штатам.

Взгляните на функцию группировки в SOLR, которая называется свертыванием полей (http://wiki.apache.org/solr/FieldCollapsing).

Также обратите внимание на bobo-browse. В частности, составныеFacetHandlers http://code.google.com/p/bobo-browse/wiki/CompositeFacetHandlers. bobo-browse можно интегрировать в SOLR (http://code.google.com/p/bobo-browse/wiki/SolrIntegration)

person abdollar    schedule 11.01.2011

Ознакомьтесь с аспектами Pivot (т.е. дерева решений): http://wiki.apache.org/solr/SimpleFacetParameters#Pivot_.28ie_Decision_Tree.29_Faceting

Поддерживается в Solr 4.0.

person jem    schedule 12.01.2011

Предполагая, что ваши документы в индексе представляют собой одну службу....

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

Например, у вас может быть поле city_facet со значениями:

  • "Огайо - Майами"
  • "Флорида - Майами"

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

person rfeak    schedule 11.01.2011