【问题标题】:Solr search entire index but only return the lowest level descendentsSolr 搜索整个索引,但只返回最低级别的后代
【发布时间】:2020-05-26 02:16:24
【问题描述】:

我完全迷失在掌握 Solr 生态系统...也许是因为我正在处理的数据结构从根本上难以在 Solr 中正确处理。我正在尝试索引分层分类系统的文档/条目(NAICS:https://www23.statcan.gc.ca/imdb/p3VD.pl?Function=getVD&TVD=1181553)。

结构是这样的:

  • 11-农业
    • 111-作物生产
      • 1111-油料种子和粮食种植
        • 11111-D 大豆种植
          • 111110-大豆种植
          • 111111-其他豆类养殖
        • 11112-小麦种植
          • 111120-小麦种植

我想要的是索引 Solr 中的整个结构(使用推荐的任何方式,即嵌套文档或其他一些类别/路径变量解决方案等),以便当用户搜索并且他们的搜索词过于广泛而无法匹配在结构的较低级别,而不是在结构中匹配较高的所有后代仍然匹配并返回。 例如,用户搜索“油料种子种植”并返回代表 1111-油料种子和谷物种植的文档的匹配项。相反,我想要的是只返回该条目的最后一个叶子后代(111110、111111、111120),就好像它们最初是匹配的一样。在 Solr 中如何实现这一点或有哪些选择?最终目标是仅根据用户查询将结构过滤到最低叶。

编辑: 根据收到的建议,这是我制定的方法。

curl http://localhost:8983/solr/NAICS/query -d '{
  "query": "{!join from=ANCESTOR_PATH to=DESCENDANT_PATH}NAICS:1111",
  "facet": {
    "TREE_NODES": {
      "type": "query",
      "q": "LEVEL:5",
      "facet" : {
        "TREE": {
          "type": "terms",
          "field": "DESCENDANT_PATH",
          "limit":-1
        }
      }
    }

【问题讨论】:

    标签: solr hierarchy solr8


    【解决方案1】:

    将每个较低的叶子索引为一个文档。对于每个文档,包括父项中的所有术语,一直到根。这会给你类似的东西:

    {
      "id": "111110",
      "name": "Soybean Farming",
      "path": "11-Agriculture/111-Crop Production/1111-Oil seed and Grain farming/11111-D Soybean Farming",
      "categories": [
        "11-Agriculture",
        "111-Crop Production",
        "1111-Oil seed and Grain farming",
        "11111-D Soybean Farming"
      ]
    }
    

    这将允许您针对categories 字段搜索任何术语,如果您使用string 字段(或path hierarchy tokenizer field)作为path,您还可以进行完全匹配以查找如果需要,可以使用层次结构。

    【讨论】:

    • 我曾考虑过这种方法,但我看到的两个问题是它会复制索引中的信息,如果可能的话,我想避免这些信息,我看到的另一个问题是我将限制数量向应用程序返回的记录,并依靠构面计数来确定向用户显示的内容。
    • 根据您希望如何使用它以及如何分析它来复制信息是面向文档的搜索引擎搜索作为 Lucene 的核心概念之一。除非您有非常 特定要求和异常大的数据集,否则这是实现特定目标的完全有效(和建议)的策略。刻面计数应该没问题;当然,这取决于您的需要,但路径标记器将为路径的每一级索引一个标记,为您提供适用于层次结构每一级的方面。
    • 我在这方面取得了一些成功......我已经索引了另外两个字段,祖先路径和后代路径。然后我这样查询: q={!join from=ANCESTOR_PATH to=DESCENDANT_PATH}NAICS:"1111" 它将返回具有 naics=1111 的文档以及它们的后代的任何文档。所以我现在有正确的文件被退回,但对于方面计数,这不是我想要的。构面计数应仅基于 descendant_path 中的离开节点和唯一值,但我不知道如何实现这一点。
    • 我可以轻松地从结果集中过滤掉除最低级别之外的所有级别,这修复了方面的数量,但是我真正想要的是将它们保留在结果集中但仅将它们过滤掉在不影响主查询的情况下计算方面计数...
    • 您可以只使用NAICS:1111*,因为任何以1111 开头的东西都应该是后代,不是吗?对于分面,您可以use the JSON facet API 并创建一个查询分面来选择叶节点,然后创建一个子分面,根据字段将这些分面分成适当的桶。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多