我将mongodb导入elasticsearch进行一些复杂的排序,其中一部分看起来像这样
{
"ProductName": {
"WORLDWIDE": {
"zh": "产品 1",
"en": "product 1"
},
"CHINA": {
"zh": null,
"en": null
}
}
}
在Mongodb的聚合中,我可以使用
$project: {
"ProductName": {
$ifNull: [ {$ifNull: [ "$ProductName.CHINA.zh", "$ProductName.CHINA.en" ]}, {$ifNull: [ "$ProductName.WORLDWIDE.zh", "$ProductName.WORLDWIDE.en" ]} ]
}
}
将特定值放入一个没有嵌套的字段中。
在Elasticsearch中可以做同样的事情吗?
答案 0 :(得分:0)
我想出了下面的Script Fields,在其中创建了一个新变量my_productName
,并根据您在mongo聚合查询中提到的条件分配了值。
请注意,我假设字段的类型为keyword
,否则将无法使用text数据类型。可以随意更改以下查询中的条件。
我还假设您的所有文档都将具有您问题中同一文档中提到的任何值。
POST <your_index_name>/_search
{
"query" : {
"match_all": {}
},
"script_fields" : {
"my_productName" : {
"script" : {
"lang": "painless",
"source": """
if(doc['ProductName.CHINA.zh'].value!=null){
return doc['ProductName.CHINA.zh'].value;
}else if(doc['ProductName.CHINA.en'].value!=null){
return doc['ProductName.CHINA.en'].value;
}else if(doc['ProductName.WORLDWIDE.zh'].value!=null){
return doc['ProductName.WORLDWIDE.zh'].value;
}else {
return doc['ProductName.WORLDWIDE.ch'].value;
}
"""
}
}
}
}
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [
{
"_index" : "<your_index_name>",
"_type" : "<your_type_name>",
"_id" : "1",
"_score" : 1.0,
"fields" : {
"my_productName" : [
"产品 1"
]
}
}
]
}
}
另一件事是,如果您希望其他字段出现,则可以添加
"_source": {"fieldname1", "fieldname2}
上方的"query"
。
希望这会有所帮助,如果有帮助,请随时投票和/或接受答案:)
让我知道您是否有任何疑问。