有什么Elasticsearch操作接近MongDB投影吗?

时间:2019-04-12 05:31:49

标签: elasticsearch elasticsearch-aggregation elasticsearch-6

我将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中可以做同样的事情吗?

1 个答案:

答案 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"

希望这会有所帮助,如果有帮助,请随时投票和/或接受答案:)

让我知道您是否有任何疑问。