2011-01-11 1 views
3

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

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

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

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

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

+0

Чтобы уточнить, у вас есть документ на город или один документ на услугу, в котором перечислены все города и состояния в документе? – rfeak

+0

Это документ за услугу. – bcm6435

+0

Все предложения отлично работают, если пользователь принадлежит только одной ветви. Что происходит, если я выдаю запрос для facet.field = city, тогда города для обоих состояний отображаются без возможности их группировки в соответствии с их родительским состоянием. Даже если я поворачиваюсь или группируюсь, он думает, что все города принадлежат каждому государству. Если я помещаю разделитель в качестве rfreak, я могу восстановить дерево, но, похоже, он требует большой обработки клиентской стороны, потому что он не будет автоматически сворачивать подсчеты до уровня состояния. – bcm6435

ответ

0

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

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

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

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

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

1

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

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

Кроме того, взгляните на bobo-browse. В частности, compositeFacetHandlers http://code.google.com/p/bobo-browse/wiki/CompositeFacetHandlers. bobo-browse можно интегрировать в SOLR (http://code.google.ком/р/бобо-просмотра/вики/SolrIntegration)

2

Смотрите первый случай использования описано here. (Клиент обработки на стороне для индексирования и запросов необходимо!)

Категория навигации

Проблема: у вас есть дерево категорий и ваши продукты классифицируются в нескольких из этих категорий.

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

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

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

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

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

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

+0

Думаю, я понимаю, что вы говорите, я делал что-то подобное, прежде чем я разразился в разных полях. Что происходит, когда продукт находится в нескольких категориях, и вы хотите украсить листья, но ограничить его только одной ветвью?Я не могу найти решение, которое даст мне перечисление и счет, не включая листья из другой ветки. Я могу сохранить его как значения id и вернуться к db, чтобы найти родительскую категорию, чтобы отфильтровать нежелательные листья, но это также означает, что мне приходится обрабатывать счета на стороне клиента. Может, я что-то упустил? – bcm6435

+0

мы всегда показываем корень (например, фильмы, книги, ...). Затем пользователь видит, в какие ветки он может войти. – Karussell

+0

(одна проблема с компоновкой: в сообщении была удалена эта вещь level_category) – Karussell