在Xapian中使用术语前缀表示类别层次结构的最佳方法是什么?

时间:2011-09-28 15:51:52

标签: hierarchy xapian term prefixes

假设我有以下示例层次结构:

  • US
    • 密歇根
      • 底特律
      • 大急流城
      • Lansing的
    • 明尼苏达
      • 大急流城
      • 明尼阿波利斯
      • 圣保罗
    • 俄亥俄
      • 哥伦布
      • 大急流城
      • 桑达斯基

我认为有两种方法可以用“(密歇根州大急流城”)文档编制索引前缀:

XFIRSTLEVELus
XSECONDLEVELmichigan
XTHIRDLEVELgrandrapids

XFIRSTLEVELus
XSECONDLEVELus_michigan
XTHIRDLEVELus_michigan_grandrapids

我倾向于使用第二种方法,认为它会返回更直观的结果。也就是说,包含密歇根州大急流城搜索标准的搜索不太可能包含明尼苏达州和俄亥俄州的文件。

然而,这种方法的两个方面困扰我。首先,为层次结构的每个级别创建和维护术语前缀都是错误的。其次,值的串联似乎是使用权重的替代。

那么,用术语前缀表示层次结构的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

与所有这些事情一样,最好考虑一下您希望如何使用数据,而不是最好的数据'存储它的方式是。

过去,我已将您描述的位置数据存储为URL路径,将地名转换为slug,因此上面的示例如下所示:

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)或通配符搜索中获取所有文档以获取某个位置的所有子项({{ 1}})

这可能是也可能不是最好的'解决方案,但它可能适用于某些应用程序:)