2017-02-22 13 views
0

非常に単純な作業のために2〜3日間ロックを掛けています。検索結果を取得し、モデルを記入してください。私はMongoDbでこの作業を何度もやってきましたが、私はElasticSearchに完全に立ち往生しています。簡単な方法が必要ですが、北を見つけることはできません。私は周りにたくさん読むが、私は本当に立ち往生している。NodeJsとElastiSearchを使用してhits._sourceのリストを使ってjson文字列を作成するには

検索結果が表示されます。誰かが少なくとも_index、_type、_id、_scoreを取り除き、配列として_sourceだけを返す方法を教えてくれれば役に立つかもしれません。

ElasticSearchはスピードを考慮して設計されているため、_ScoreはElasticSearchを使用する理由の一部です。私の場合、ElasticSearchはサーバで使用する必要があります。ElasticSearchはすでにそのようなサーバでElasticSearchを使用でき、ElasticSearchはすでにLogStashとKibanaで使用されているからです。私はこのような挑戦にとても満足しています。私はElasticSearchについて多くのことを学んできましたが、_sourceコンテンツを「シリアライズ/デシリアライド」する必要があります。

私はすべてのコードを執筆しました。私はスキーマとmongoosasticを使用して手掛かりが存在するかもしれないと思うが、私は実際に何を試してアイデアがないです。

スキーマを使用してモデルを作成したことがわかります。プラグインmongoosasticを追加しました。私はそれがElngSearchと同様のモデルをMOngoDbと簡単に似ているように使う方法があるかもしれないと思いますが、私はそれがどういうものか分かりません。

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私はMongoDBのプラスmongooastic

の操作に使用する方法でinspirid

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

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

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

myschema.plugin(mongoosastic) 
+1

Elasticsearchは、JSONとして結果を返しますシリアライズ/デシリアライズ。通常のjsonのように使用してください。例えば** res ["_ source"] **、それはあなたの検索に応じてオブジェクトまたは配列を与えます。 – Hosar

答えて

0

resp.hits.hitsの配列を好みのフォーマットの配列にマップするだけで済みます。

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

newArray

はresp.hits.hits配列からすべて_sourceフィールドが含まれていますので、次のようになります。

[{"my_prop1": "my first string to be inserted"},{"my_prop1": "my second string to be inserted"}] 
あなたが必要としないので、
関連する問題