ElasticSearch:聚合

时间:2018-02-02 23:19:44

标签: elasticsearch

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

案例A)结果是带有计数代币(术语)的篮子,下降。

案例B)结果是带有计数字段文本(全文)的篮子,下降。简单的复杂性:我想以不区分大小写的方式对文本进行分组。相当一个测验...据我所知,分析器是一种为反向索引创建令牌的方法。所以,它不会帮助我以不区分大小写的方式对文本进行分组......

请提供参考或示例,

此致

1 个答案:

答案 0 :(得分: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上进行汇总。
  • 对于您的第二种情况,您需要使用tokenizer构建自定义分析器 - >令牌过滤器中的关键字 lowercasetokenfilter ,并在 field1.raw 中使用此自定义分析器。但是它会更好索引字段field1.raw as not_analyzed,因为分析字符串字段上的聚合是一个内存密集型进程,而在代码级别索引时是小写字段值
相关问题