当前位置: 首页 > 知识库问答 >
问题:

即使字段的映射是在'text'和'keyword'类型上,如何在'sum'和'avg'aggs中进行操作?

季森
2023-03-14

我试图对我的Elasticsearch查询执行AVG聚合,一切都很好,但我遇到了一个问题--我想对text/关键字类型上的嵌套字段执行前面提到的aggs。

之所以如此,是因为在执行searchAPI时,如果需要这些特定的嵌套字段和子字段,我们将使用keywords分析器。

下面是我的映射:

"eng" : {
  "type" : "nested",
  "properties" : {
    "date_updated" : {
      "type" : "long"
    },
    "soc_angry_count" : {
      "type" : "float"
    },
    "soc_comment_count" : {
      "type" : "float"
    },
    "soc_dislike_count" : {
      "type" : "float"
    },
    "soc_eng_score" : {
      "type" : "float"
    },
    "soc_er_score" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "soc_haha_count" : {
      "type" : "float"
    },
    "soc_kf_score" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "soc_like_count" : {
      "type" : "float"
    },
    "soc_love_count" : {
      "type" : "float"
    },
    "soc_mm_score" : {
      "type" : "float"
    },
    "soc_sad_count" : {
      "type" : "float"
    },
    "soc_save_count" : {
      "type" : "float"
    },
    "soc_share_count" : {
      "type" : "float"
    },
    "soc_te_score" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "soc_view_count" : {
      "type" : "float"
    },
    "soc_wow_count" : {
      "type" : "float"
    }
  }
}

请关注eng嵌套字段的SOC_ER_ScoreSOC_KF_ScoreSOC_TE_Score子字段...

当我执行以下AGG时,它工作正常:

'aggs' => [
    'ENGAGEMENT' => [
        'nested' => [
            'path' => "eng"
        ],
        'aggs' => [
            'ARTICLES' => [
                //Use Histogram because the pub_date is of
                //long data type
                //Use interval 86400 to represent 1 day
                'histogram' => [
                    'field'  => "eng.date_updated",
                    "interval" => "86400",
                ],
                'aggs'= [
                    'SUM' => [
                        'sum' => [
                            "field" => "eng.soc_like_score"
                        ]
                    ]
                ]
            ]
        ]
    ]
]

下面是执行搜索API后的输出

但是如果查询如下所示:

'aggs' => [
    'ENGAGEMENT' => [
        'nested' => [
            'path' => "eng"
        ],
        'aggs' => [
            'ARTICLES' => [
                //Use Histogram because the pub_date is of
                //long data type
                //Use interval 86400 to represent 1 day
                'histogram' => [
                    'field'  => "eng.date_updated",
                    "interval" => "86400",
                ],
                'aggs'= [
                    'SUM' => [
                        'sum' => [
                            "field" => "eng.soc_te_score"
                        ]
                    ]
                ]
            ]
        ]
    ]
]

输出如下所示:

执行的解决方案

解决方案1(供确认)
在阅读了一些论坛讨论之后,我了解到基于Java的解析是可用的,但似乎对我来说不起作用

以下是我修改后的查询:

'aggs'= [
    'SUM' => [
        'sum' => [
            "field" => "Float.parseFloat(eng.soc_te_score).value"
        ]
    ]
]

但不幸的是,它的响应为null或0

顺便说一句,我使用Laravel作为我的Web框架,这就是为什么我的调试器或错误消息窗口是这样的

请求您的帮助,请提前感谢您!

共有1个答案

贺佑运
2023-03-14

我将创建另一个数字子字段除了关键字一。因此,可以使用关键字字段进行搜索,使用数字字段进行聚合。

例如,像这样修改映射:

"soc_er_score" : {
  "type" : "text",
  "fields" : {
    "keyword" : {
      "type" : "keyword",
      "ignore_above" : 256
    },
    "numeric" : {
      "type" : "long",
      "ignore_malformed": true
    }
  }
},

然后可以使用:

  • soc_er_score进行全文搜索
  • soc_er_score.keyword用于排序、术语聚合和精确匹配
  • soc_er_score.numeric用于 sum和其他度量聚合。

如果索引中已经有数据,只需通过添加新的子字段来修改映射,如下所示:

PUT my-index/_mapping/doc
{
  "properties": {
    "eng": {
      "soc_er_score" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          },
          "numeric" : {
            "type" : "long",
            "ignore_malformed": true
          }
        }
      }
    }
  }
}

然后调用update by queryendpoint以获取新的映射:

POST my-index/_update_by_query

完成后,将为所有现有文档索引eng.soc_er_score.numeric字段。

 类似资料:
  • 本文向大家介绍详解Python中映射类型(字典)操作符的概念和使用,包括了详解Python中映射类型(字典)操作符的概念和使用的使用技巧和注意事项,需要的朋友参考一下 映射类型操作符 (1)标准类型操作符         字典可以和所有的标准类型操作符一起工作,但却不支持像拼接(concatenation)和重复(repetition)这样的操作。这些操作对序列有意义,可对映射类型行不通。    

  • 问题内容: 我有一个使用mysql数据库的应用程序,但是我想在hsqldb内存数据库中运行该应用程序的单元测试。问题是我的某些可持久模型对象具有一些字段,这些字段已注释为columnDefinition =“ TEXT”以强制mysql满足长字符串值,但现在hsqldb不知道TEXT的含义。如果我将其更改为CLOB,则hsqldb很好,但mysql失败。 有没有可用于与mysql和hsqldb兼容

  • 我的班级等级如下: 并尝试将DTO映射到实体 地图如下: 我在详细信息字段中收到带有A或B的DTO,这是在调试器中检查的。但是模型制图者投掷 无法实例化目标组织的实例。包裹基础确保该组织。包裹Base有一个非私有的无参数构造函数。 我尝试使用显式提供程序(没有用于此映射): 我还尝试像这样实现自定义转换器(也没有执行): 模型映射器似乎没有对字段使用这个类型映射,只对hierarhy的根使用。在这

  • 我有以下带有父类的结构,几个子类,每个子类都有自己的枚举和各种键。父类需要具有具有以枚举为特征的键的映射,但枚举类型是抽象的 - 它由实例化的子类确定。 我想使用泛型类型来要求Enum类型来自该特定类 - 因此您只能将APPLE添加到水果中,将芹菜添加到蔬菜中,反之亦然。我的应用程序还要求任何 Food 对象能够查询其可能的类型(例如,打印出所有可能的类型,而不仅仅是我们在 Map 中的类型)。

  • 问题内容: _id成员的类型仅从bson.ObjectId派生时,不再映射为ObjectId类型: id 在Mongo中应该是一个 _ObjectId 。但是事实证明,选择了 字符串 : Mongo Shell: 这可能是有意的,因为 bson.ObjectId 本身是从 string 派生的。但是在这里,这对我们不利。 我们可以告诉mgo将_id映射到数据库中的ObjectId吗? 问题答案:

  • 问题内容: 我想用Hibernate映射超类中的通用字段。 我的母亲班是: 一个子类: 如您所见,我将覆盖value字段以指定要在数据库中使用的列。我的表ParameterValue由几列组成,每种类型对应一列。 但是hibernate抱怨: 好的,但是超类中getValue的良好配置是什么?(我在“需要帮助的地方”发表了评论) 问题答案: 我很确定您不能将单个Java属性映射到三个不同的列。您将