我需要使用elasticsearch在Firebase上执行联接查询,
谁能帮我?
特别是我有两个节点,在子节点中,我有一个字段是父节点的ID,因此,我希望拥有父节点的所有字段。
如何在代码中建立索引?
另外,在我的客户端中,我使用elasticsearchclient,
这是索引节点的代码摘录:
var db = admin.database();
var etest = db.ref(type);
etest.on('child_added', createOrUpdateIndex);
etest.on('child_changed', createOrUpdateIndex);
etest.on('child_removed', removeIndex);
function createOrUpdateIndex(snap) {
client.index(index, type, snap.val(), snap.key)
.on('data', function(data) { console.log('indexed', snap.key + data ); })
.on('error', function(err) { console.log('index error ', err); }).exec();
}
function removeIndex(snap) {
client.deleteDocument(index, type, snap.key, function(error, data) {
if( error ) console.error('failed to delete', snap.key, error);
else console.log('deleted', snap.key);
});
}
并获取查询结果:
var queue = db.ref("search");
queue.child('request').on('child_added', processRequest);
function processRequest(snap) {
console.log('process...... ');
snap.ref.remove(); // clear the request after we receive it
var data = snap.val();
// Query ElasticSearch
client.search(index, data.type, { "query": { 'query_string': {
"query" : data.query
}}})
.on('data', function(results) {
var res = JSON.parse(results);
console.log(JSON.stringify(res.hits));
console.log("TOTAL " + JSON.stringify(res.hits.total));
queue.child('response/'+snap.key).set(results);
})
.on('error', function(error){ console.log("errore"); }).exec();
}
先感谢您
最佳答案
有两种存储数据的方法。
首先是创建一个嵌套文档。如果您需要对某些值执行搜索并且仅需要其他信息进行显示,这将很有帮助。
PUT /my_index {
"mappings": {
"yourIndex": {
"properties": {
"yourColumn": {
"type": "nested",
"properties": {
"name": { "type": "string" },
"parentNode": { "type": "string" },
"childNode": { "type": "string" }
}
}
}
}}}
例如。
'str1','parent1','child1'
'str2''parent1','child2'
如果您不需要维护任何层次结构,
您可以简单地创建3个单独的列并像平面数据一样存储。
您可以指定parent1 id并在两种情况下搜索所有文档。