如何在elasticsearch mongo river中解析或平坦化对象引用

How to resolve or flatten object references in elasticsearch mongo river?

本文关键字:对象引用 elasticsearch mongo river      更新时间:2023-09-26

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

示例:

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

使用monoriver,省属性被索引为一个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通过使用ajax的REST api与mongodb通信,不幸的是它没有工作,因为我认为不可能在浏览器外使用ajax。但即使这有效,我也不确定这是否是一个好的和有效的解决方案。

关于如何解决我的问题有什么建议吗?或者也许有其他的方法来平面化/解析对象引用之前索引到ES使用monoriver ?如有任何建议,我将不胜感激。

Thanks in advance:)

注意:我还需要自动更新已经索引的现有文档中的对象引用,当它们被修改时。

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

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

  1. Elasticsearch计划弃用rivers
  2. 您可以完全控制可用的相关数据
  3. 你将能够使用复杂的查询来定义什么被索引(一个用户被更新?更新所有存储的数据)