【问题标题】:ElasticSearch: AggregationsElasticSearch:聚合
【发布时间】:2018-02-03 13:20:43
【问题描述】:

假设在我的文档中,我有一个文本字段进行分析。我只是迷失在 ElasticSearch AggregationAPI 中。我需要支持 2 种不同的情况:

案例 A) 结果是带有计数令牌(术语)的篮子,降序。

案例 B) 结果是带有计数字段文本(整个文本)的篮子,降序排列。小麻烦:我想以不区分大小写的方式对文本进行分组。相当测验......据我所知,分析器是一种为反向索引创建标记的方法。所以,它不会帮助我以不区分大小写的方式对文本进行分组......

请提供参考或示例,

问候,

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    聚合和搜索在弹性搜索中使用了两种不同的数据结构

    例如

    如果我用这些值和标准分析器索引一个字段 数据棕色, 狗 , 小狗 , 狐狸 , 狐狸, 在 , 跳了, 懒惰的 , 飞跃, 超过 , 快,夏天,该

    这是倒排索引

    Term      Doc_1   Doc_2   Doc_3
    ------------------------------------
    brown   |   X   |   X   |
    dog     |   X   |       |   X
    dogs    |       |   X   |   X
    fox     |   X   |       |   X
    foxes   |       |   X   |
    in      |       |   X   |
    jumped  |   X   |       |   X
    lazy    |   X   |   X   |
    leap    |       |   X   |
    over    |   X   |   X   |   X
    quick   |   X   |   X   |   X
    summer  |       |   X   |
    the     |   X   |       |   X
    

    聚合使用的结构

    Doc      Terms
    -----------------------------------------------------------------
    Doc_1 | brown, dog, fox, jumped, lazy, over, quick, the
    Doc_2 | brown, dogs, foxes, in, lazy, leap, over, quick, summer
    Doc_3 | dog, dogs, fox, jumped, over, quick, the
    
    • 聚合还收集分析器生成的令牌。

    你的问题的解决方案是

    您必须使用字段以两种不同的方式索引相同的数据

    例如

    {
      "mappings": {
        "my_type": {
          "properties": {
            "field1": {
              "type": "string",
              "analyzer":"standard",
              "fields": {
                "raw": { 
                  "type":  "string",
                  "index": "keywordAnalyzed"
                }
              }
            }
          }
        }
      }
    }
    

    这将使用两个不同的分析器索引两个不同字段中的相同数据。 所以在第一种情况下

    • 您可以在 field1 上进行聚合。
    • 对于第二种情况,您需要在令牌过滤器中使用标记器 -> keywordlowercasetokenfilter 构建自定义分析器,并使用此自定义分析器field1.raw 中。但是,最好将字段 field1.raw 索引为 not_analyzed,因为在分析的字符串字段上进行聚合是一个内存密集型过程,并且在代码级别索引时使用小写字段值

    【讨论】:

    • 我错过了使用多字段,然后我准备将多个 my_field 用于我的单个逻辑类别。只是因为我需要通过应用不同的自定义分析器以多种方式分析相同的文本。现在我知道正确的方法是使用“字段”。谢谢!
    • 鉴于我之前的帖子,有以下一些问题:1)如果我需要按原样聚合文本但不区分大小写,我有 2 个不同的选项 1.a)使用 [keyword 的自定义分析器-tokenizer, 小写] 1.b) 推送时客户端小写。第二个选项让我怀疑,因为无论如何我都需要获取/列出原始文档。关于您的映射示例,我的问题是:2.a)什么是“索引”:“keywordAnalyzed”。我读到“索引”是一个布尔参数。 2.b)关于优先级:什么“类型”应该是根,应该在“字段”下定义?
    • 我的错。应该是分析器而不是索引 :keywordTokenized.Second 完全取决于您,哪个应该是根,哪个应该在字段下定义。什么应该是根目录和什么应该在字段下没有区别
    猜你喜欢
    • 2017-09-24
    • 2014-11-18
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2018-06-17
    • 2022-01-15
    相关资源
    最近更新 更多