路径层次标记上的聚合

Leo*_*Leo 4 navigation aggregate e-commerce elasticsearch

在过去的几天里,我读了很多书,但找不到适合我的解决方案。还看到了一些string正在使用该类型的东西,这在我使用的 ES 版本中已被弃用。

我在 Elasticsearch 上:5.6.4

我已经索引了一些文档,并尝试了映射并尝试使用analyzers( path_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"
              }
            }
          }
        }
      },
      ...
Run Code Online (Sandbox Code Playgroud)

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"
      ],
      ...
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

现在我不知道我是否必须使用Path Hierarchy tokenizer某种方式、nested类型、两者的组合或 ES 提供的任何东西。那么是否有可能进行例如术语聚合category_tags并获得“有用”的结果?

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

小智 6

我在这个问题上找到了几篇很棒的文章(这里这里),并且还做了一些实验。虽然这两篇文章引用了旧版本,但一些调整使 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
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您的聚合请求将如下所示:

{
  "aggs": {
    "category": {
      "terms": {
        "field": "category_path"
      }
    }
  },
  "size": 0
}
Run Code Online (Sandbox Code Playgroud)

你的结果:

  "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
    }
  ]
Run Code Online (Sandbox Code Playgroud)