2012-10-30 16 views
13

Ich habe versucht herauszufinden, wie man Daten von elasticsearch mit einem jQuery AJAX-Aufruf korrekt anfordert. Ich bekomme entweder einen Parsing-Fehler oder ich bekomme jedes Dokument im Index, unter dem ich suche.AJAX Call mit Elasticsearch Suche

$(document).ready(function() { 

    var timer = null; 
    function dicom_search() { 
     var box = $('#s_box').val(); 

     $.ajax({ 
      url: 'http://localhost:9200/dicoms/dicoms/_search', 
      type: 'POST', 
      //contentType: 'application/json; charset=UTF-8', 
      crossDomain: true, 
      dataType: 'json', 
      data: { 
       query:{match:{_all:$('#s_box').val()}}, 
       pretty: true, 
       fields: '_id' 
      }, 
      success: function(response) { 
       var data = response.hits.hits; 
       var doc_ids = []; 
       var source = null; 
       var content = ''; 

       if (data.length > 0) { 
        for (var i = 0; i < data.length; i++) { 
         source = data[i].fields; 
         doc_ids.push(source._id); 
         content = content + ' ' + source._id + '<br />'; 
        } 

        $('#res').removeClass('text-error').addClass('text-success').html(content); 
       } else { 
        $('#res').removeClass('text-success').addClass('text-error').html('No results found.'); 
       } 


      } 
     }); 
    } 

    $('#s_box').live('keyup', function() { 

     if (timer) { 
      clearTimeout(timer); 
     } 
     timer = setTimeout(dicom_search, 600); 

    }); 
}); 

Hier ist mein Fehler:

{ 
    "error":"SearchPhaseExecutionException[Failed to execute phase [query], total failure; shardFailures {[GUiivW0TQVSNv2HQyxu8Vw][dicoms][0]: SearchParseException[[dicoms][0]: from[-1],size[-1]: Parse Failure [Failed to parse source [_na_]]]; nested: ElasticSearchParseException[Failed to derive xcontent from [email protected]9bb]; }{[GUiivW0TQVSNv2HQyxu8Vw][dicoms][3]: SearchParseException[[dicoms][3]: from[-1],size[-1]: Parse Failure [Failed to parse source [_na_]]]; nested: ElasticSearchParseException[Failed to derive xcontent from [email protected]9bb]; }{[GUiivW0TQVSNv2HQyxu8Vw][dicoms][1]: SearchParseException[[dicoms][1]: from[-1],size[-1]: Parse Failure [Failed to parse source [_na_]]]; nested: ElasticSearchParseException[Failed to derive xcontent from [email protected]9bb]; }{[GUiivW0TQVSNv2HQyxu8Vw][dicoms][4]: SearchParseException[[dicoms][4]: from[-1],size[-1]: Parse Failure [Failed to parse source [_na_]]]; nested: ElasticSearchParseException[Failed to derive xcontent from [email protected]9bb]; }{[GUiivW0TQVSNv2HQyxu8Vw][dicoms][2]: SearchParseException[[dicoms][2]: from[-1],size[-1]: Parse Failure [Failed to parse source [_na_]]]; nested: ElasticSearchParseException[Failed to derive xcontent from [email protected]9bb]; }]", 
    "status":500 
} 

EDIT: Ich habe es herausgefunden:

var data = { 
      query: { 
       match: { 
        _all: $('#s_box').val() 
       } 
      }, 
      fields: '_id' 
     }; 

$.ajax({ 
      url: 'http://localhost:9200/dicoms/dicoms/_search', 
      type: 'POST', 
      //contentType: 'application/json; charset=UTF-8', 
      crossDomain: true, 
      dataType: 'json', 
      data: JSON.stringify(data), 
      success: function(response) { 
       var data = response.hits.hits; 
       var doc_ids = []; 
       var source = null; 
       var content = ''; 

       if (data.length > 0) { 
        for (var i = 0; i < data.length; i++) { 
         source = data[i].fields; 
         doc_ids.push(source._id); 
         content = content + ' ' + source._id + '<br />'; 
        } 

        $('#res').removeClass('text-error').addClass('text-success').html(content); 
       } else { 
        $('#res').removeClass('text-success').addClass('text-error').html('No results found.'); 
       } 


      }, 
      error: function(jqXHR, textStatus, errorThrown) { 
       var jso = jQuery.parseJSON(jqXHR.responseText); 
       error_note('section', 'error', '(' + jqXHR.status + ') ' + errorThrown + ' --<br />' + jso.error); 
      } 
     }); 
+3

Der wesentliche Unterschied zwischen Ihrem ursprünglichen Code und bearbeitete Code ist, dass Sie Ihre Javascript-Objekt zu JSON konvertiert und übergeben, daß in den $ Schnipsel() 's Eigenschaft "data", indem Sie JSON.stringify (data) ausführen. Ich glaube, das war der Schlüssel, um dies zum Laufen zu bringen. –

+0

könnten Sie Ihre gesamte HTML-Seite irgendwo veröffentlichen? –

Antwort

0

Anstatt Ihren AJAX-Anruf zu schreiben, empfehle ich Ihnen, dieses Tool mit der Bezeichnung Postman zu verwenden. Postman hat ein einfaches Motto -

Making API development easy

Also, falls Sie Schwierigkeiten haben, Ihre ES-Anfragen schreiben, oder vielleicht entscheiden Sie nicht jQuery AJAX/XHR zu verwenden, und vielleicht möchten Sie cURL/Unirest/NSURL verwenden und Was nicht, können Sie einfach den Postman Request Builder verwenden, um Ihre einfache HTTP-Anfrage aufzuschreiben, dann finden Sie einen Link Code in der Box direkt darunter, und Sie können Anfragen in der Sprache Ihrer Wahl damit generieren . Einschließlich AJAX, ja. Also ich würde dir empfehlen, das zu versuchen.

Hier ist der Link, wo Sie Postman von herunterladen - https://www.getpostman.com/postman