Mám kolekciu mongodb indexovanú v Elastic Search a chcem vrátiť dokumenty MongoDB zoradené podľa elastického vyhľadávania _score pre daný dotaz.
Som zmätený, prečo nižšie uvedená publikácia správne opakuje dokumenty a aktualizuje (ukážkové) skóre v každom dokumente:
Meteor.publish "docs", (params) ->
pub = @
Document.find({}, limit: 20).forEach (doc) ->
doc._score = 123 # some score
pub.added "documents", doc._id, doc
pub.ready()
Nižšie uvedené použitie klienta elastického vyhľadávania však nevracia výsledky a iterátor sa v skutočnosti nikdy ani nevykoná:
Meteor.publish "docs", (params) ->
pub = @
client.search
size: 20
body:
query:
filtered:
query:
multi_match:
fields:["body"]
query: query
.then (response) =>
results = response.body?.hits?.hits
ids = _.inject _.pluck(results, "_id"), (ids, id)->
ids.push({_id: id}); ids
, []
scores = getScores(results)
Document.find($or: ids).forEach (doc) ->
# Here is never reached.
doc._score = scores[doc._id]
pub.added "documents", doc._id, doc
, (error) ->
console.trace error if error
pub.ready()
Nebudem prekvapený, ak môj prístup bude ďaleko odtiaľto. Existuje lepší spôsob, ako to dosiahnuť?
odpovede:
1 pre odpoveď č. 1Myslím, že stačí počkať, kým zavoláte pub.ready()
dovtedy, kým sa neodošle „úvodná úplná snímka sady záznamov“. Takže ... na konci spätného volania o úspešnom vyhľadávaní.
dokumenty: http://docs.meteor.com/#publish_ready
-1 pre odpoveď č. 2
na strane meteorového servera existuje doplnkový klient Elasticsearch. Pridané metódy na jednoduché spravovanie kolekcií rieky mongo a metóda meteoru na vyhľadávanie z klientskej strany.
pozri sa sem: https://github.com/andrewreedy/meteor-elasticsearch