Solr地理层次结构

3
我一直在尝试在solr中实现层次分面,但无法在我的情况下完成。我已经阅读了几篇关于在solr中进行层次结构的文章以及补丁64和792的解决方案。我遇到的主要问题是,我的实体可以属于层次结构的多个分支。我的数据的当前形式是一个用户文档,其中包含国家、州和城市的MVAs。
例如,一个人可能为整个阿拉巴马州提供服务,但只为乔治亚州的某些城镇提供服务。现在,状态级别的分面计数将计算服务区域的不同个体数量,阿拉巴马州为1,乔治亚州为1,展开到城市级别后,每个城市都有一个计数(换句话说,城市计数之和不一定等于州计数,因为计数不是相互排斥的)。
我卡住的部分是当在城市上进行分面时,我无法知道它们属于哪个州,因为用户列在阿拉巴马州和乔治亚州,并且我无法找到将属性彼此关联的方法。如果solr-64支持像US/Alabama/Mobile/和US/Georgia/Atlanta/这样的多个分支,则可能会起作用。但是,目前我还没有能够使用夜间构建将其编译,所以我有点困难。
有人有更好的方法吗?

请澄清一下,您是每个城市都有一个文档,还是每个服务都有一个文档,其中列出了文档中所有城市和州? - rfeak
所有建议对于仅属于一个分支的用户都能正常工作。问题是,如果我发出facet.field=city的查询,则两个州的城市将显示出来,但无法按照其父州进行分组。即使我进行交叉表或分组,它也认为所有城市都属于每个州。如果像rfreak建议的那样放置分隔符,我可以重构树形图,但似乎需要大量客户端处理,因为它不会自动将计数汇总到州级别。 - bcm6435
4个回答

2
第一个用例请点击这里查看(需要客户端处理以进行索引和查询!) 分类导航 问题:您有一个类别树,您的产品被分为多个类别。
对于这个问题有两种相对类似的解决方案。我将描述其中一种:
  • 创建一个多值字符串字段,名为“category”。使用类别ID(或名称,如果要避免DB查询)。
  • 你有一个类别树。确保文档不仅获得叶子类别,而是所有类别直到根节点。
  • 现在通过“-1”作为限制在类别字段上进行面向。
  • 但是,如果您只想显示一级类别怎么办?例如,如果您不想同时显示其他级别或者如果它们太多。

    然后按照<level>_category对类别字段进行索引。为此,在索引时需要将完整的类别树存储在RAM中。然后使用facet.prefix=<level>_来过滤该级别的类别列表。

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

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

    答:从DB获取类别父项很容易,如果您将类别ID而不是类别名称存储在Solr中。或者从参数列表中获取父项稍微有些复杂,但可行。在这种情况下,您需要在Solr中存储类别名称。


我想我明白你的意思,之前我也做过类似的事情,将级别分成不同的字段。当一个产品属于多个类别时,如果你想在叶子节点上进行限制但只约束到一个分支,会发生什么?我找不到解决方案,可以给我枚举和计数,而不包括其他分支的叶子。我可以将其存储为ID值,并返回到数据库查找父类别以过滤掉不需要的叶子,但这也意味着我必须在客户端处理计数。也许我漏掉了什么? - bcm6435
我们总是先显示根目录(例如电影、书籍等),然后用户可以看到他可以进入哪些分支。 - Karussell
排版问题:在帖子中,level_category这个东西已经被删除了。更新了。 - Karussell
“我必须在客户端处理计数”是什么意思? - Karussell
关于“在叶子上进行分面,但仅限于一个分支”的问题->您正在使用level_categoryId进行分面处理,这样您就可以过滤掉所有其他分支。或者您的意思是什么? - Karussell

1

我对你的问题不是很熟悉,但看起来你需要按城市和州进行分组。

可以查看 SOLR 中名为“字段折叠”(http://wiki.apache.org/solr/FieldCollapsing)的 group-by 功能。

此外,也可以查看 bobo-browse。具体来说,查看复合 FacetHandlers http://code.google.com/p/bobo-browse/wiki/CompositeFacetHandlers。bobo-browse 可以集成到 SOLR 中(http://code.google.com/p/bobo-browse/wiki/SolrIntegration)。


1

0

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

对于城市,制作一个字段,该字段是州和城市使用某种分隔符连接起来。这个字段不必向用户显示,它可以是您存储但不索引的字段之外的附加字段,该字段是城市的真实名称。

例如,您可以有一个具有以下值的city_facet字段:

  • "Ohio - Miami"
  • "Florida - Miami"

您可能希望选择更安全的分隔符。我想连字符可能会产生潜在冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接