elasticsearch - MongoDB投影附近是否有任何Elasticsearch操作?

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

最佳答案

我想出了下面的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/

相关文章:

google-app-engine - 用于应用引擎的 Stackdriver 与 ELK

elasticsearch - 如何对两种不同的数据类型执行搜索查询?

elasticsearch-6 - 内部动态脚本编译过多,最大 : [75/5m]

elasticsearch - 如何让 Elastic Search 聚合来镜像查询过滤逻辑?

elasticsearch - ElasticSearch:指标聚合是否支持min_doc_count

elasticsearch - 与 Elastic Search 6 和 php ClientBuilder 完全匹配

docker - Elasticsearch 6 + Kibana + Docker撰写错误

node.js - 使用 Node js 从 elasticsearch 中分段获取数据

elasticsearch - Nest筛选功能分数

java - ElasticSearch 映射动态模板 Java