我将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中可以做同样的事情吗?
最佳答案
我想出了下面的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"
。希望这会有所帮助,如果有帮助,请随时投票和/或接受答案:)
让我知道您是否有任何疑问。
关于elasticsearch - MongoDB投影附近是否有任何Elasticsearch操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55645045/