我们有一个弹性搜索索引,其中包含以下映射(仅显示与此问题相关的部分映射)
fieldValue
您可以看到string
类型为fieldValue
:数据库中JSON
列的原始数据存储在fieldValue
类型列中(在Postgresql中)。用例是这样的,当存储这些数据时JsNumber
可以是有效的JsString
,JsBoolean
,[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
答案 0 :(得分:0)
实现此目的的一种方法是在弹性搜索中创建不同的字段type
JsValue
JsNumber
,JsBoolean
,JsString
等等)。现在,在建立索引时 - 应用程序可以派生出适当类型的JsValue
字段,以确定它是JsString
,JsNumber
,JsBoolean
等。
在应用程序端,我可以解码正在编入索引的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
}
这样现在boolean
值fieldBoolean
存储在number
中,long
存储在fieldLong
等等中。现在运行指标聚合成为正常业务,反对{{1} }或fieldDouble
字段(取决于查询用例)。通知fieldValue
字段仍然存在于ES映射和索引中。应用程序将继续将值转换为string
并像以前一样将其存储在fieldValue
中 - 这样,不关心类型的查询只能查询索引中的fieldValue
字段。
答案 1 :(得分:0)
听起来你应该有两个单独的字段,一个用于值是字符串的情况,另一个用于当它是数字的实例时。
根据您对此数据编制索引的方式,可能很容易或很难。但是,你有一个可能是字符串或数字的字段有点奇怪。
无论如何,elasticsearch无法在单个字段中同时执行这两项操作