在索引到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
答案 0 :(得分:1)
我认为最简单的方法是使用某种cron作业或同步应用程序。为什么呢?