【问题标题】:How to resolve or flatten object references in elasticsearch mongo river?如何在 elasticsearch mongo river 中解析或展平对象引用?
【发布时间】:2014-06-23 06:20:02
【问题描述】:

是否可以在索引到 Elasticsearch 之前展平或解析对其他集合的引用?

例如我有这个架构:

var PartSchema = new mongoose.Schema({
  title: {
    type: String,
    required: true
  },
  province : {
    type : mongoose.Schema.ObjectId,
    ref : 'Province',
    required: true
  },
});

使用 mongoriver,省属性被索引为 ObjectId,因此在我的应用程序的搜索结果中,省是对象 ID,因此对用户没有用,所以我想展平/解析省属性,以便我可以访问省份的属性,例如:part.province.name、part.province.createdAt 等...

我最初的解决方案是使用脚本过滤器和映射。这是我所做的:

在 ES 上定义一个映射

curl -XPUT 'http://localhost:9200/parts/part/_mapping' -d '{"properties":{"__v":{"type":"long"},
"title":{"type":"string"},
"province":{
    "type":"nested",
    "properties": {
        "name" : {"type": "string"}
    }
}}}'

创造了一条河流:

curl -XPUT "localhost:9200/_river/pdm/_meta" -d '
{
  "type": "mongodb",
  "mongodb": {
    "servers": [
      { "host": "localhost", "port": 27017 }
    ],
    "db": "pdm",
    "collection": "parts"
  },
  "index": {
    "name": "parts",
    "type": "part"
  }
}'

创建了一个脚本:

ctx.document.province = {};
ctx.document.province.name = 'Static name to be inserted by script';

它有效,但目前脚本上的名称只是静态的。显然我需要从 mongodb 数据库中动态获取它,所以我尝试使用 lang-javascript 通过 REST api 使用 ajax 与 MongoDB 进行通信,不幸的是它不起作用,因为我认为不可能在浏览器之外使用 ajax。但即使这可行,我也不确定它是否是一个不错且有效的解决方案。

关于如何解决我的问题的任何想法?或者在使用 mongoriver 索引到 ES 之前,还有其他方法可以展平/解析对象引用?任何建议将不胜感激。

提前致谢:)

注意:我还需要在修改时自动更新已编入索引的现有文档中的对象引用。

相关问题:https://groups.google.com/forum/#!topic/elasticsearch/e3CelbOkgWk

【问题讨论】:

    标签: javascript mongodb elasticsearch


    【解决方案1】:

    我相信最简单的方法是使用 cron 作业或某种同步应用程序。为什么?

    1. Elasticsearch 计划弃用河流
    2. 您可以完全控制可用的相关数据
    3. 您将能够使用复杂的查询来定义要索引的内容(用户已更新?同时更新所有存储的数据)

    【讨论】:

      猜你喜欢
      • 2014-09-09
      • 2016-01-21
      • 1970-01-01
      • 2021-07-15
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多