2012-10-30 14 views
13

Ho cercato di capire come richiedere correttamente dati da elasticsearch utilizzando una chiamata jQuery AJAX. O ottengo un errore di analisi o otterrò tutti i documenti nell'indice che sto cercando.Chiamata AJAX con Elasticsearch Cerca

$(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); 

    }); 
}); 

Ecco il mio errore:

{ 
    "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: ho capito:

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

La differenza fondamentale tra il codice originale e il tuo codice modificato è che è stato convertito il vostro oggetto javascript per JSON e passato che nel $ .ajax() 's proprietà "data" facendo JSON.stringify (dati). Credo che sia stata la chiave per far funzionare tutto questo. –

+0

potresti pubblicare la tua intera pagina html da qualche parte? –

risposta

0

Invece di scrivere la chiamata AJAX, suggerirei di utilizzare questo strumento chiamato Postman. Postman ha un semplice motto -

Making API development easy

Quindi, nel caso in cui si hanno problemi a scrivere le vostre richieste ES, o forse si decide di non usare jQuery AJAX/XHR, e forse si desidera utilizzare cURL/Unirest/NSURL e no, puoi semplicemente utilizzare il builder di richiesta Postman per scrivere la tua semplice richiesta Http, quindi troverai un link chiamato codice nella casella proprio sotto quella, e puoi generare richieste nella lingua di tua scelta usando quello . Compresi AJAX, sì. Quindi ti consiglierei di provare ad usarlo.

Ecco il link dove è possibile scaricare Postino da - https://www.getpostman.com/postman