弹性搜索公共映射类型和基于数据类型的运行聚合

时间:2016-02-26 19:08:12

标签: elasticsearch

我们有一个弹性搜索索引,其中包含以下映射(仅显示与此问题相关的部分映射)

fieldValue

您可以看到string类型为fieldValue:数据库中JSON列的原始数据存储在fieldValue类型列中(在Postgresql中)。用例是这样的,当存储这些数据时JsNumber可以是有效的JsStringJsBoolean[JsValue][1](任何有效的fieldValue现在的问题是当存储这个时ES中的fieldValue - 它必须是明确的类型 - 因此我们将数据转换为String,同时将数据推送到ElasticSearch。

以下是来自弹性搜索的示例数据

"instFields": [
        {
          "sourceFieldId": 1233,
          "fieldValue": "Demo Logistics LLC"
        },
        {
          "sourceFieldId": 1236,
          "fieldValue": "169451"
        }
      ]

这就是现在我们想要在fieldValue上运行各种metrics aggregations的地方。如果sourceFieldId = 1236然后在[avg][3]上运行fieldValue,则问题fieldValue必须在ES中存储为string - 原因是fieldValue正在{应用程序中的{1}}类型字段。什么是在弹性搜索中创建映射的最佳方式,以便JsValue可以使用适当的类型vs fieldValue类型进行存储,以便可以运行string的各种度量聚合。类型fieldValue(虽然在ES中编码为long

2 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是在弹性搜索中创建不同的字段type JsValue JsNumberJsBooleanJsString等等)。现在,在建立索引时 - 应用程序可以派生出适当类型的JsValue字段,以确定它是JsStringJsNumberJsBoolean等。

在应用程序端,我可以解码正在编入索引的type fieldValue

value match{
      case JsString(s) => 
      case JsNumber(n) => 
      case JsBoolean(b)
}

现在修改弹性搜索中的映射并添加更多字段 - 每个字段都有正确的类型 - 如下所示

"instFields": {
                                    "properties": {
                                        "_index": {
                                            "type": "object"
                                        }, 
                                        "fieldBoolean": {
                                            "type": "boolean"
                                        }, 
                                        "fieldDate": {
                                            "fields": {
                                                "raw": {
                                                    "format": "dateOptionalTime", 
                                                    "type": "date"
                                                }
                                            }, 
                                            "format": "dateOptionalTime", 
                                            "type": "date"
                                        }, 
                                        "fieldDouble": {
                                            "fields": {
                                                "raw": {
                                                    "type": "double"
                                                }
                                            }, 
                                            "type": "double"
                                        }, 
                                        "fieldLong": {
                                            "fields": {
                                                "raw": {
                                                    "type": "long"
                                                }
                                            }, 
                                            "type": "long"
                                        }, 
                                        "fieldString": {
                                            "fields": {
                                                "raw": {
                                                    "index": "not_analyzed", 
                                                    "type": "string"
                                                }
                                            }, 
                                            "type": "string"
                                        }, 
                                        "fieldValue": {
                                            "fields": {
                                                "raw": {
                                                    "index": "not_analyzed", 
                                                    "type": "string"
                                                }
                                            }, 
                                            "type": "string"
                                        }

现在在编制索引时

value match{
      case JsString(s) => //populate fieldString
      case JsNumber(n) => //populate fieldDouble (there is also fieldLong)
      case JsBoolean(b) //populate fieldBoolean
}

这样现在booleanfieldBoolean存储在number中,long存储在fieldLong等等中。现在运行指标聚合成为正常业务,反对{{1} }或fieldDouble字段(取决于查询用例)。通知fieldValue字段仍然存在于ES映射和索引中。应用程序将继续将值转换为string并像以前一样将其存储在fieldValue中 - 这样,不关心类型的查询只能查询索引中的fieldValue字段。

答案 1 :(得分:0)

听起来你应该有两个单独的字段,一个用于值是字符串的情况,另一个用于当它是数字的实例时。

根据您对此数据编制索引的方式,可能很容易或很难。但是,你有一个可能是字符串或数字的字段有点奇怪。

无论如何,elasticsearch无法在单个字段中同时执行这两项操作

相关问题