Каков наилучший способ представления иерархии категорий с использованием префиксов терминов в Xapian? - PullRequest
0 голосов
/ 28 сентября 2011

Предположим, у меня есть следующий пример иерархии:

  • США
    • Мичиган
      • Детройт
      • Гранд-Рапидс
      • Lansing
    • Миннесота
      • Гранд-Рапидс
      • Миннеаполис
      • Сент-Пол
    • Огайо
      • Columbus
      • Гранд-Рапидс
      • Sandusky

Я вижу два способа индексирования документа «Гранд-Рапидс, Мичиган» с префиксами:

XFIRSTLEVELus
XSECONDLEVELmichigan
XTHIRDLEVELgrandrapids

или

XFIRSTLEVELus
XSECONDLEVELus_michigan
XTHIRDLEVELus_michigan_grandrapids

Я склонен использовать второй подход, полагая, что он даст более интуитивные результаты. То есть поиск, который включает критерии поиска Гранд-Рапидс, Мичиган, с меньшей вероятностью будет включать документы из Миннесоты и Огайо.

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

Итак, как лучше всего представить иерархию с префиксами терминов?

1 Ответ

1 голос
/ 07 ноября 2011

Как и во всех этих вещах, лучше подумать о том, как вы хотите использовать данные, а не о том, каков «лучший» способ их хранения.

В прошлом я хранилданные о местоположении, как вы описываете, как если бы они были URL-путями, преобразуя название места в слаг, поэтому ваш приведенный выше пример будет выглядеть примерно так:

us
us/michigan
us/michigan/detroit
us/michigan/grand-rapids
us/michigan/lansing
us/minnesota
us/minnesota/grand-rapids
us/minnesota/minneapolis
us/minnesota/st-paul
us/ohio
us/ohio/columbus
us/ohio/grand-rapids
us/ohio/sandusky

Дайте каждому документу префиксный термин с одним из этих путейи используйте поиск по точному термину, чтобы получить все документы только в определенном месте (location:us/minnesota/minneapolis), или поиск по шаблону, чтобы получить все дочерние элементы местоположения (location:us/minnesota/*)

. Это может или не может быть 'лучшее решение, но оно может работать для некоторых приложений:)

...