如何在elasticsearch mongo河中解析或展平对象引用?

时间:2014-05-06 14:50:27

标签: javascript mongodb elasticsearch

在索引到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

1 个答案:

答案 0 :(得分:1)

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

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