如何使用mongoosastic + AJAX进行即时搜索?

时间:2015-11-25 10:08:18

标签: jquery ajax node.js elasticsearch mongoosastic

我已经成功配置了mongoosastic,我尝试搜索并且它工作正常,但是当涉及到前端我不确定如何实现这一点时,我尝试了很多方法但是不能来一个很好的解决方案。

这是代码。

// For the Search API
    router.post('/api/search/', function(req, res, next) {
      Job.search(
        {
          query_string:
          { query: req.body.search }
        } , function(err, results) {
            if (err) return next(err);
            res.json(results);
        });
    });

所以每当我搜索与'engineer'相关的东西时,我都会得到一个json数据

enter image description here

所以后端确实完美运行。

然而,当涉及到jquery和ajax时,我一直得到错误的请求

逻辑:每当插入某些内容然后发布并找到结果。

这是前端jquery代码。

  $('#search').keyup(function() {

    var search_term = $(this).val();


    $.ajax({
      type: "POST",
      url: "/api/search",
      success: function(){
        $('search_results').html(search_term);
      },
      error: function(data){
        alert('Error', data);
      }
    });

  });

HTML

<input type="text" class="form-control input-lg" id="search" name="search" placeholder="Search for part-time..." />



 <div id="search_results">


    </div>

如何将json结果插入search_results

2 个答案:

答案 0 :(得分:3)

您需要做的是

  1. 在每个击键时,获取输入值
  2. 通过Ajax将其发送到您的后端
  3. 使用你成功时获得的JSON(这里我们只在div中显示“title:salary”)
  4. 所以你的前端代码看起来像这样:

    $('#search').keyup(function() {
    
      // 1. grab the search term from the input field
      var search_term = $(this).val();
    
      // 2. send it to your back-end via ajax in the body 
      $.ajax({
        method: "POST",
        url: "/api/search",            // <-- your back-end endpoint
        data: "search=" + search_term  // <-- what you're sending
        dataType: "json",              // <-- what you're expecting back
        success: function(json){       // <-- do something with the JSON you get
          // 3. parse the JSON and display the results
          var res = json.hits.hits.map(function(hit) {
              return hit._source.title + ": " + hit._source.salary;
          });
          $('search_results').html(res.join("<br />"));
        },
        error: function(data){
          alert('Error', data);
        }
      });
    });
    

答案 1 :(得分:0)

我正在研究与此非常类似的事情。首先,看起来您在初始ajax请求中缺少参数,因此您的节点服务器没有获得任何信息:

$('#search').keyup(function() {
//Perform the ajax request
var search_term = $(this).val();
$.ajax({
  type: "POST",
  url: "/api/search",
  data: {"search": search_term},
  success: function(data) {
     //Loop over all the data and output it, appending data to element
     //with a line break
     for(var i=0; i < data.hits.length; i++)
    $('search_results').append(data.hits[i]._source.title+'<br />');
  },
  error: function(data){
    alert('Error', data);
  }
});

});

在调试这些问题时,如果您有权访问它,可以在我的节点服务器中使用console.log(),以查看它实际获得的数据:

// For the Search API
router.post('/api/search/', function(req, res, next) {
  console.log("%j", req.body.search)
  Job.search(
    {
      query_string:
      { query: req.body.search }
    } , function(err, results) {
        if (err) return next(err);
        res.json(results);
    });
});

日志会非常清楚地报告您所期望的未定义或正确的字符串,这样您就可以看到您的参数是否正确

您可能还想检查节点服务器地址和端口(就像完整性检查一样)。对于我的ajax请求,我必须把

url: "http://localhost:9200/api/search" 

在我的查询前面只是因为我的服务器位于不同的端口

以下是有关jQuery post函数的更多信息供您参考:

http://api.jquery.com/jquery.post/

希望这有帮助!