如何从一个字段是其他字段组合的弹性搜索中获取数据
How to get data from elasticsearch where one field is combination of other fields
我有一个 elasticsearch 数据,其中一个字段是作为多个字段的组合导出的,如下所示。
Field 1 Field 2 Field 3 Derived Field
a b c a_b_c
b c a b_c_a
c a b c_a_b
即Derived field = field1_field2_field3
我错误地在 derived field = field3_field2_field1
中创建了一些记录
我想编写一个查询来获取派生字段不等于 field1_field2_field3 的所有记录。
我试过了,但不确定什么是正确的 ES 查询。
是否可以从 ES 获取此数据。根据我的理解,ES 不支持像 SQL 这样的连接。我不确定嵌套查询是否可以帮助我。
https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/joining-queries.html
最后,经过一些查找,我能够通过在 ES 中触发以下 update_by_query 脚本来解决问题。
POST /<index_name>/_update_by_query
{
"query": {
"bool": {
"filter": {
"script": {
"script": {
"source": "String.valueOf(doc['field3'].value) + \"_\" + String.valueOf(doc['field2'].value) + \"_\"+ String.valueOf(doc['field1'].value) == String.valueOf(doc['derivedField'].value)",
"lang": "painless"
}
}
}
}
},
"script":{
"source": " ctx._source['derivedField'] = ctx._source['field1'] + \"_\" + ctx._source['field2'] + \"_\" + ctx._source['field3'] ",
"lang": "painless"
}
}
我有一个 elasticsearch 数据,其中一个字段是作为多个字段的组合导出的,如下所示。
Field 1 Field 2 Field 3 Derived Field
a b c a_b_c
b c a b_c_a
c a b c_a_b
即Derived field = field1_field2_field3
我错误地在 derived field = field3_field2_field1
我想编写一个查询来获取派生字段不等于 field1_field2_field3 的所有记录。
我试过了,但不确定什么是正确的 ES 查询。
是否可以从 ES 获取此数据。根据我的理解,ES 不支持像 SQL 这样的连接。我不确定嵌套查询是否可以帮助我。
https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html https://www.elastic.co/guide/en/elasticsearch/reference/current/joining-queries.html
最后,经过一些查找,我能够通过在 ES 中触发以下 update_by_query 脚本来解决问题。
POST /<index_name>/_update_by_query
{
"query": {
"bool": {
"filter": {
"script": {
"script": {
"source": "String.valueOf(doc['field3'].value) + \"_\" + String.valueOf(doc['field2'].value) + \"_\"+ String.valueOf(doc['field1'].value) == String.valueOf(doc['derivedField'].value)",
"lang": "painless"
}
}
}
}
},
"script":{
"source": " ctx._source['derivedField'] = ctx._source['field1'] + \"_\" + ctx._source['field2'] + \"_\" + ctx._source['field3'] ",
"lang": "painless"
}
}