路径层次结构标记上的聚合

时间:2017-11-08 22:20:00

标签: elasticsearch navigation e-commerce aggregate

我在过去几天里经常阅读,但无法找到适合我的解决方案。还看到了string类型正在使用的一些内容,这在我使用的ES版本中已弃用。

我在Elasticsearch上: 5.6.4

我已将某些文档编入索引,并使用该映射并尝试使用analyzerspath_hierarchy tokenizer),查看Ingest Node但似乎没有任何内容适用于我。 它与category_tags字段有关(参见底部的示例)。我有可能按照自己喜欢的方式对其进行重组,如果有必要,我会生成这些数据。

我想要一个典型的电子商务导航,所以我认为这应该通过category_tags上的聚合来实现?我创建了一个数组来显示一个文档可以有多个类别, 每个层次结构可以任意深入。我认为它不会超过4或5级,但可能会发生。

我的动态模板如下:

      ...
    "analyzer": {
      "my_path_hierarchy_analyzer": {
        "type": "custom",
        "tokenizer": "my_path_hierarchy_tokenizer"
      },
      "my_pipe_analyzer": {
        "type": "custom",
        "tokenizer": "my_pipe_tokenizer"
      }
    },
    "tokenizer": {
      "my_path_hierarchy_tokenizer": {
        "type": "path_hierarchy",
        "delimiter": "|"
      },
      "my_pipe_tokenizer": {
        "type": "pattern",
        "pattern": "|"
      }
    }
  }
},
"mappings": {
  "item": {
    "dynamic_templates": [
      {
        "category_tags_analyzed": {
          "match": "category_tags",
          "mapping": {
            "type": "text",
            "analyzer": "my_path_hierarchy_analyzer",
            "fields": {
              "textsearch": {
                "type": "text",
                "analyzer": "my_pipe_analyzer"
              }
            }
          }
        }
      },
      ...

text类型字段上执行aggs时,由于fielddata而引发错误。此外,我认为无论如何我都不应该将它设置为true。在keyword类型字段上,它甚至没有索引文档,因此会抛出错误。所以我猜不出来。

文件看起来像是:

"hits": [
  {
    "_index" : "my_index",
    "_type" : "my_type",
    "_id" : "1",
    "_score" : 1.0,
    "_source" : {
      ...,
      "category_tags" : [
        "Men|Tops|Shirts",
        "Men|Sale",
        "Men|Whatever"
      ],
      ...
    }
  }
]

现在我不知道我是否必须以某种方式使用Path Hierarchy tokenizernested类型,两者的组合或ES提供的任何内容。 所以甚至可以做到例如category_tags上的字词汇总,并获得"有用的"导致?

有用的是数据是结构化的,所以我可以将它用于基于电子商务(树状)的导航。 这样用户就可以点击导航树,(在每次点击时,我都会向ES发送请求以对其进行过滤),并根据点击的内容显示结果。

1 个答案:

答案 0 :(得分:2)

我在这个问题上发现了几篇很棒的文章(herehere),并且还进行了一些实验。虽然这两篇文章引用了旧版本,但是有一些调整可以解决ES 6的问题。

这对我有用,我没有测试每个项目的多个类别(例如你的数组示例),但它可能仍然有效:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "path-analyzer": {
          "tokenizer": "path-tokenizer"
        }
      },
      "tokenizer": {
        "path-tokenizer": {
          "type": "path_hierarchy",
          "delimiter": "|"
        }
      }
    }
  },
  "mappings": {
    "item": {
      "dynamic": "strict",
      "properties": {
        "category_path": {
          "type": "text",
          "analyzer": "path-analyzer",
          "search_analyzer": "keyword",
          "fielddata": true
        }
      }
    }
  }
}

您的聚合请求看起来像这样:

{
  "aggs": {
    "category": {
      "terms": {
        "field": "category_path"
      }
    }
  },
  "size": 0
}

结果:

  "buckets": [
    {
      "key": "Men",
      "doc_count": 11
    },
    {
      "key": "Men|Sale",
      "doc_count": 4
    },
    {
      "key": "Men|Tops",
      "doc_count": 3
    },
    {
      "key": "Men|Tops|Shirts",
      "doc_count": 2
    }
  ]