2017-02-09 2 views
0

у меня есть некоторые коллекции MongoDB:агрегации Elasticsearch несколькими индексами

Истории:

{ 
    title: { type: String }, 
    text: { type: String } 
} 

Комментарии:

{ 
    text: { type: String }, 
    story: { type: mongoose.Schema.Types.ObjectId, ref: "Stories" } 
} 

Likes:

{ 
    story: { type: mongoose.Schema.Types.ObjectId, ref: "Stories" } 
} 

Это коллекции индексируются Elasticsearch. Поэтому мне нужно фильтровать Истории в Elasticsearch по комментариям и комментариям.

Примеры данных.

Stories: 
{ 
    "title": "First story", 
    "text": "This must be the MOST popular story..." 
} 

{ 
    "title": "Second story", 
    "text": "This story is popular too, but not as the first story." 
} 

{ 
    "title": "Third story", 
    "text": "This is a unpopular story, because dont have any comment or like" 
} 


Comments: 
{ 
    "title": "Foo", 
    "story": ObjectId("First Story ID") 
} 

{ 
    "title": "Foobar", 
    "story": ObjectId("First Story ID") 
} 

{ 
    "title": "Bar", 
    "story": ObjectId("Second Story ID") 
} 


Likes: 
{ "story": ObjectId("First Story ID") } 
{ "story": ObjectId("First Story ID") } 
{ "story": ObjectId("First Story ID") } 
{ "story": ObjectId("First Story ID") } 

{ "story": ObjectId("Second Story ID") } 
{ "story": ObjectId("Second Story ID") } 

{ "story": ObjectId("Third Story ID") } 

В результате фильтрации должно быть так:

  1. Первая история (4 Понравилось, 2 комментариев)
  2. Вторая история (2 Понравилось 1 комментарий)
  3. Третья история (1 like)

Действительно ли это сделать с помощью Elasticsearch? И как я могу это сделать?

PS. Почему я решил не фильтровать с Монго? Потому что Mongo показывает очень медленный результат такой агрегации.

PPS. Монгольский код агрегации для этой задачи:

db.getCollection('stories').aggregate([ 
{$lookup:{from:"comments",localField:"_id", foreignField:"story", as:"comments"}}, 
{$lookup:{from:"likes",localField:"_id", foreignField:"story", as:"likes"}}, 
{$project: { title: 1, text: 1,comments:1,likes:1, count: { $add: [ {$size: "$comments"}, {$size: "$likes"} ] } } }, 
{$sort:{"count":-1}} 
]) 

ответ

0

Каковы ваши критерии оценки?

В любом случае, я бы просто реализовал это как два отдельных terms aggregations и объединить результаты на стороне клиента. Должна быть возможность смоделировать это как отношение parent-child, но это было бы намного более сложным без значительных проблем.

Вы можете получить 10 самых популярных историй в первом запросе, а затем получить комментирование комментариев только для этих идентификаторов (filtering values with exact values).

Смежные вопросы