ElasticSearch词聚合

dy2hfwbg  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(477)

我正在编写一个python脚本来获取elasticsearch索引中的唯一值。我使用术语聚合来获取唯一值及其计数。但是,当我将字段列表传递给脚本时,我意识到有些字段存储为

"abc" : {
            "type" : "keyword"
        }

有些储存为

"xyz" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword"
              }
            }
          }

在术语聚合期间,我使用查询

{
    "aggs" : {
        "abc" : {
            "terms" : {
                "field" : "abc"
            }
        }
    }, "size":0
}

但是当这个查询用于“xyz”时,它会给出错误 Fielddata is disabled on text fields by default. Set fielddata=true on [description] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead. 要运行“xyz”的查询,我需要在其中添加“.keyword”,但是“”不会运行。
是否有任何方法可以检查哪个字段属于哪个类型,然后使用if/else相应地更新查询?

o0lyfsai

o0lyfsai1#

您可以同时拥有这两个属性--字段可以聚合,也可以搜索 .keyword 符号。只需按照error msg的建议调整Map:

"xyz" : {
   "type" : "text",
   "fielddata": true
}

然后重新索引&你就可以走了。
至于是否有查询时间检查来确定哪些字段是-没有。elasticsearch的核心原则之一是字段类型是预先确定和定义的,以便对其进行适当的索引,从而优化搜索/聚合。因此,在查询时假设您知道哪些字段属于哪种类型。

相关问题