是否有任何接近 MongoDB 投影的 Elasticsearch 操作?

is there any Elasticsearch operations close to MongDB projection?

我将我的 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 otherwise it is not possible using 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" 之上。

希望这有帮助,如果有帮助,请随时投票 and/or 接受答案:)

如果您有任何疑问,请告诉我。