0

Ich kämpfe für zwei oder drei Tage Sperren für eine sehr einfache Aufgabe: Holen Sie sich das Ergebnis der Suche und füllen Sie ein Modell. Ich habe diese Aufgabe viele Male mit MongoDb gemacht, aber ich bin komplett mit ElasticSearch fest und ich bin mir sicher, dass es eine einfache Möglichkeit geben muss, aber ich kann keinen Norden finden. Ich habe viel herum gelesen, aber ich bin wirklich festgefahren.Wie erstellt man eine JSON-Zeichenfolge mit einer Liste von hits._source mit NodeJs und ElastiSearch

Ich kann das Ergebnis der Suche sehen. Wenn mir jemand zumindest sagt, wie man _index, _type, _id und _score wegnimmt und nur die _source als ein Array zurückgibt, kann es nützlich sein.

Ich verstehe, soweit ich sehen kann, dass ElasticSearch mit Geschwindigkeit im Hinterkopf entwickelt wurde, so _score ist Teil des Grundes, ElasticSearch zu verwenden. In meinem Fall muss ich nur ElasticSearch auf unserem Server verwenden, da sie ElasticSearch in einem solchen Server zulassen und ElasticSearch bereits für LogStash und Kibana verwendet wird. Ich bin sehr glücklich mit dieser Herausforderung und ich habe viel über ElasticSearch gelernt, aber ich brauche etwas Norden über "serialize/desearile" den _source Inhalt, um vorwärts zu bewegen.

Ich legte meinen gesamten Code unter. Ich denke, dass es einen Hinweis geben kann, mit Schema und mongoosastisch, aber ich bin wirklich ohne Ideen, was ich versuchen soll.

Sie können sehen, ich habe ein Modell mit Schema erstellt und ich habe das Plugin mongoostic hinzugefügt. Ich denke, es könnte eine Möglichkeit geben, ein solches Modell mit ElasticSearch zu verwenden, ähnlich wie wir es mit MOngoDb machen, aber ich weiß nicht wie.

Server.js

var express = require('express'); 
var mongoose = require('mongoose'); 
var bodyParser = require('body-parser'); 

var esController = require('./controllers/mycontroller'); 

mongoose.connect('mongodb://localhost:27017/greencard'); 

var app = express(); 

var router = express.Router(); 

router.route('/myexposedmethod') 
    .get(esController.myexposedmethod); 
app.use('/api', router); 

app.listen(3000); 

package.json

{ 
    "name": "greencard-dmz-es-oracle", 
    "main": "server.js", 
    "dependencies": { 
    "elasticsearch": "^12.1.3", 
    "express": "^4.1.1", 
    "express-session": "^1.6.1", 
    "mongoosastic": "^4.2.4", 
    "mongoose": "^3.8.8", 
    "reqclient": "^2.1.0" 
    } 
} 

mycontroller.js

var elasticsearch = require('elasticsearch'); 
var Promise = require('bluebird'); 
var Mymodel = require('../models/mymodel'); 

var query = { 
    "bool": { 
     "must": { 
      "term": { "my_prop1": "my" } 
     } 
    } 
} 

exports.myexposedmethod = function (req, res) { 

    var client = new elasticsearch.Client({ 
     host: 'localhost:9200', 
     //log: 'trace' 
    }); 

    function closeConnection() { 
     client.close(); 
    } 

    function createIndex() { 
     return client.indices.create({ 
      index: "myindex", 
      body: { 
       "mappings": { 
        "my_type": { 
         "properties": { 

          "my_prop1": { "type": "string" } 
         } 
        } 
       } 
      } 
     } 

     ); 
    } 

    function addToIndex() { 
     return client.index({ 
      index: 'myindex', 
      type: 'my_type', 
      body: { 

       my_prop1: 'my second string to be inserted' 

      }, 
      refresh: true 
     }); 
    } 

    function search() { 
     return client.search({ 
      index: 'myindex', 
      type: 'my_type', 

      body: { 
       query: { 
        match: { 
         my_prop1: { 
          query: 'my' 
         } 
        } 
       } 
      } 
     }).then(function (resp) { 
      var hits = resp.hits.hits; 

      console.log(hits.length); 

      hits.forEach(function (hit) { 
       console.log("_source: ", hit._source); 
      }) 

      //I know it is not going to work but may express what I am locking for 
      //var mymodel_result = JSON.stringify({ 
      // mymodel: hits._source 
      //}); 
//the return to http://localhost:3000/api/myexposedmethod is 
/*[   
    { 
    "_index": "myindex", 
    "_type": "my_type", 
    "_id": "AVpmQ4GbDU4zGDgLLeeR", 
    "_score": 0.16948202, 
    "_source": { 
     "my_prop1": "my first string to be inserted" 
    } 
    }, 
    { 
    "_index": "myindex", 
    "_type": "my_type", 
    "_id": "AVpmXus8DU4zGDgLLeeU", 
    "_score": 0.16948202, 
    "_source": { 
     "my_prop1": "my second string to be inserted" 
    } 
    } 
]*/ 
//but I want something like 
//[{"my_prop1": "my first string to be inserted"},{"my_prop1": "my second string to be inserted"}] 
//or 
//[{"mymodel": "my first string to be inserted"},{"mymodel": "my second string to be inserted"}] 


      return res.json(hits); 

     }, function (err) { 
      console.trace(err.message); 
     }); 
    } 

    Promise.resolve() 
     //.then(createIndex) 
     //.then(addToIndex) 
     .then(search) 
     .then(closeConnection) 
     ; 

}; 

mymodel.js inspirid, wie ich mit MongoDB arbeiten und mongooastic

var mongoose = require('mongoose'), 
    mongoosastic = require('mongoosastic'), 
    Schema = mongoose.Schema 

var myschema = new Schema(
    { my_prop1: String } 
) 

myschema.plugin(mongoosastic) 
+1

Elasticsearch werden die Ergebnisse als JSON zurückgeben, so dass Sie nicht brauchen, serialisieren/deserialisieren. Benutze es einfach wie normales json. z.B. ** res ["_ source"] **, das Ihnen je nach Ihrer Suche ein Objekt oder ein Array liefert. – Hosar

Antwort

0

Sie müssen nur das Array resp.hits.hits einem Array zuordnen, das nach Ihren Wünschen formatiert ist.

var newArray = resp.hits.hits.map(function(hit) { 
return hit._source; 
}); 

newArray werden alle _Source Feld aus der resp.hits.hits Array enthalten, so wird es wie folgt aussehen:

[{"my_prop1": "my first string to be inserted"},{"my_prop1": "my second string to be inserted"}] 
Verwandte Themen