【问题标题】:solr geography hierarchysolr 地理层次结构
【发布时间】:2011-01-14 04:17:29
【问题描述】:

我一直在想办法在 solr 中用层次结构实现分面,但不知道如何在我的情况下做到这一点。我已经阅读了几篇关于在 solr 中进行层次结构的文章以及补丁 64 和 792 中的解决方案。我遇到的主要问题是我有可以属于层次结构的多个分支的实体。我的数据的当前形式是一个用户文档,其中包含国家、州和城市的 MVA。

以地理层次结构为例,人们可以将其服务列出到城市级别。一个人可以服务于整个阿拉巴马州,但只能服务于佐治亚州的某些城镇。现在,州级的分面计数计算了为阿拉巴马州为 1 和乔治亚州为 1 的地区服务的不同个人,当扩展到城市级别时,每个城市都有一个计数(换句话说,城市的总和)计数不一定等于状态计数,因为计数不是互斥的)。

美国(1)
格鲁吉亚(1)
亚特兰大(1)
哥伦布(0)
雅典(0)
阿拉巴马州(1)
手机(1)
伯明翰(1)
亨茨维尔(1)

我正在挂断的部分是在面对城市时,我无法知道他们属于哪个州,因为用户在阿拉巴马州和乔治亚州都有列出,我想不出一种联系方式彼此的属性。如果 solr-64 支持同一文档的多个分支,例如 US/Alabama/Mobile/ 和 US/Georgia/Atlanta/,它可能会起作用。到目前为止,我还不能让它与夜间构建一起编译,所以我有点卡住了。

有没有人有更好的方法来做到这一点?

【问题讨论】:

  • 澄清一下,您是每个城市都有一个文档,还是每个服务都有一个文档,其中列出了文档中的所有城市和州?
  • 所有建议都适用于仅属于 1 个分支的用户。发生的情况是,如果我发出对 facet.field=city 的查询,那么两个州的城市都会显示,无法根据其父州对它们进行分组。即使我转动或分组,它认为所有城市都属于每个州。如果我像 rfreak 建议的那样放置一个分隔符,我可以重建树,但它似乎需要大量客户端处理,因为它不会自动将计数汇总到状态级别。

标签: solr hierarchy facet


【解决方案1】:

参见here 描述的第一个用例。 (需要用于索引和查询的客户端处理!)

分类导航

问题:您有一个类别树,而您的产品分为多个类别。

这个问题有两个相对相似的解决方案。我将描述其中之一:

  • 创建一个名为“类别”的多值字符串字段。使用类别 ID(或名称,如果您想避免数据库查询)。
  • 您有一个类别树。确保文档不仅获取叶类别,还获取根节点之前的所有类别。
  • 现在以“-1”为限制在类别字段上分面
  • 但是,如果您只想显示一个级别的类别怎么办?例如。如果您一次不想其他级别,或者他们太多了。

    然后索引类别字段ala <level>_category。为此,您在索引时需要 RAM 中的完整类别树。然后使用facet.prefix=<level>_ 过滤关卡的类别列表

  • 单击类别条目应导致过滤器查询ala fq=category:”<level>_categoryId”
  • 现在有点棘手的部分是您的 UI 或中间层必须解析级别,例如2 并将 2+1=3 附加到查询中: facet.prefix=3_
  • 如果您过滤级别,则剩下一个问题:

    问:如何显示从所选类别到根类别的路径?

    A:要么通过 DB 获取类别父级,如果您将类别 ID 存储在 Solr 中,这很容易——而不是类别名称。 或者从参数列表中获取父母,这有点复杂但可行。在这种情况下,您需要将类别名称存储在 Solr 中。

【讨论】:

  • 我想我明白你在说什么,在我把关卡分成不同的领域之前,我也在做类似的事情。当产品属于多个类别并且您希望在叶子上刻面但将其限制为仅 1 个分支时会发生什么?我找不到一个解决方案,可以在不包括其他分支的叶子的情况下给我枚举和计数。我可以将其存储为 id 值并返回到数据库以查找父类别以过滤掉不需要的叶子,但这也意味着我必须处理客户端的计数。也许我错过了什么?
  • 我们总是首先显示根(例如电影、书籍等)。然后用户看到他可以进入哪些分支。
  • (一个布局问题:在帖子中,level_category 被删除。更新)
  • “我必须在客户端处理计数”是什么意思?
  • 关于“叶子上的刻面,但将其限制为仅 1 个分支”-> 您在 level_categoryId 上进行刻面,这样您就可以过滤掉所有其他分支。或者你是什么意思?
【解决方案2】:

我对您的问题不太熟悉,但您似乎需要按城市、州进行分组。

查看 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.com/p/bobo-browse/wiki/SolrIntegration)

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      假设您在索引中的文档代表单个服务....

      对于城市,使用某种分隔符创建一个字段,该字段是与城市连接的状态。此字段不必向用户显示,它可以是您存储但不索引城市真实名称的字段的补充。

      例如,您可以有一个 city_facet 字段,其值为:

      • “俄亥俄州 - 迈阿密”
      • “佛罗里达 - 迈阿密”

      您可能想选择一个更安全的分隔符。我想连字符可能是潜在的冲突。

      【讨论】:

        猜你喜欢
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        • 1970-01-01
        • 2010-09-12
        • 2011-10-17
        相关资源
        最近更新 更多