【问题标题】:NodeJS returns no results with Elasticsearch / MongoosasticNodeJS 不返回 Elasticsearch / Mongoosastic 的结果
【发布时间】:2017-05-08 21:28:39
【问题描述】:

我正在尝试创建一个简单的搜索表单来搜索一个模型(产品)。

这是我使用 Mongoosastic 的产品模型:

var ProductSchema = new Schema({
    category: { type: Schema.Types.ObjectId, ref: 'Category'},
    name: String,
    price: Number,
    image: String,
    description: String
});

ProductSchema.plugin(mongoosastic, {
    hosts: [
         'localhost:9200'
    ]
});

我将 ElasticSearch 与 Product 模型连接起来,如下所示:

Product.createMapping(function (err, mapping) {
    if (err) {
      console.log("error creating mapping");
      console.log(err);
    } else {
      console.log("Mapping created");
      console.log(mapping);
    }
});

var stream = Product.synchronize();
var count = 0;
stream.on('data', function () {
  count++;
});
stream.on('close', function () {
   console.log("Indexed" + count + " documents");
});
stream.on('error', function (err) {
    console.log(err);
});

之后我创建了 GET 方法来呈现结果页面,如下所示:

router.get('/search', function (req, res, next) {
if (req.query.q){
    Product.search({
        query_string: { query: req.query.q }
    }, function (err, results) {
        if (err) return next(err);
        var data = results.hits.hits.map(function (hit) {
            return hit;
        });

        res.render('main/search-result', {
            query: req.query.q,
            data: data
        });
        console.log(data);
    });
}
});

在前端页面中,我会像这样遍历结果:

    <div class="row">
    <% for (var i = 0;i < data.length; i++){%>
    <div class="col-md-4">
        <a href="/product/<%= data[i]._source._id %>"></a>
        <div class="thumbnail">
            <img src="<%= data[i]._source.image%>" alt="">
            <div class="caption">
                <h3><%= data[i]._source.name %></h3>
                <h4><%= data[i]._source.category.name %></h4>
                <h5><%= data[i]._source.price %></h5>
                <p><%= data[i]._source.description %></p>
            </div>
        </div>
    </div>

    <% } %>
</div>

在终端一切正常

Server is Running on port 3000
Mapping created
{ acknowledged: true }
Connected to the database
Indexed120 documents

为什么我的页面上没有呈现结果?

【问题讨论】:

  • 我刚刚注意到我的终端中有一个警告DeprecationWarning: Mongoose: Query.prototype.stream() is deprecated in mongoose &gt;= 4.5.0, use Query.prototype.cursor() instead 是那个警告对 Elasticsearch 结果的影响吗!

标签: node.js elasticsearch ejs elasticsearch-plugin mongoosastic


【解决方案1】:

在你的以下代码中,

router.get('/search', function (req, res, next) {
if (req.query.q){
    Product.search({
        query_string: { query: req.query.q }
    }, function (err, results) {
        if (err) return next(err);
        var data = results.hits.hits.map(function (hit) {
            return hit;
        });

        res.render('main/search-result', {
            query: req.query.q,
            data: data
        });
        console.log(data);
    });
}
});

.search() 函数的第一个参数是 QUERY 参数,所以这里不需要 query_string。只需使用 termsmatch 查询即可。

如中,进行以下更改,

router.get('/search', function (req, res, next) {
if (req.query.q){
    Product.search({
        terms: { query: req.query.q }
    }, function (err, results) {
        if (err) return next(err);
        var data = results.hits.hits.map(function (hit) {
            return hit;
        });

        res.render('main/search-result', {
            query: req.query.q,
            data: data
        });
        console.log(data);
    });
}
});

它将开始工作。几天前我刚刚遇到了这个错误。这就是我可以解决的方法。

如果您需要更多帮助,请发表评论。

【讨论】:

    【解决方案2】:
    1. 检查您的Database。文件中有记录吗?
    2. 打印查询参数。并打印搜索查询。
    3. Postman检查您的URL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 2023-03-26
      • 2013-03-31
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      相关资源
      最近更新 更多