2016-07-11 10 views
1

Warum gibt diese ES multi-match query einen 400 Fehler (schlechte Anfrage) zurück?Elasticsearch Abfrage Parse Fehler

"query": { 
     "multi_match": { 
     "query": searchTerms, 
     "fields": ["content", "title"], 
     "operator": "and" 
     } 
     }, 
    size: 100, 
    from: 0, 
    highlight: { 
     fields: { 
     "title": {number_of_fragments: 0}, 
     "content": {number_of_fragments: 10,fragment_size: 300} 
     } 
    } 
    } 

Ich verwende diese Abfrage in Verbindung mit AngularJS UI Bootstrap typeahead Code wie diese

uib-typeahead="query as query._source.ymme for query in getSuggestions($viewValue)" typeahead-on-select="search($item)" 

Diese meine Suche ist() Funktion

$scope.search = function() { 
    console.log($scope.searchTerms); 
    $scope.currentPage = 0; 
    $scope.results.documents = []; 
    $scope.isSearching = true; 

    return searchService.search($scope.searchTerms, $scope.currentPage).then(function(es_return) {  
     var totalItems = es_return.hits.total; 
     var totalTime = es_return.took; 
     var numPages = Math.ceil(es_return.hits.total/$scope.itemsPerPage); 
     $scope.results.pagination = []; 

     for (var i = 1; i <= 100; i++) { 
     if(totalItems > 0) 
     $scope.results.totalItems = totalItems; 
     $scope.results.queryTime = totalTime; 

     $scope.results.pagination = searchService.formatResults(es_return.hits.hits); 
     $scope.results.documents = $scope.results.pagination.slice($scope.currentPage, $scope.itemsPerPage); 
     } 
     } 
    ), 
    function(error){ 
     console.log('ERROR: ', error.message); 
     $scope.isSearching = false; 
    } 
    }; 

Ich bin mir nicht ganz sicher, Was ist falsch? Ich denke, es hat etwas mit $ Scope zu tun, aber ich bin mir nicht sicher. Die Abfrage funktioniert, wenn ich das Sense-Plugin für ES verwende und es funktioniert auch, wenn ich nur einen Suchbegriff eintippe, anstatt ihn aus dem Dropdown-Menü für die automatische Vervollständigung auszuwählen.

Wenn es $scope ist, was fehlt mir?

UPDATE Alle Scherben für Phase fehlgeschlagen: [query_fetch] org.elasticsearch.search.SearchParseException: [hugetestindex] [0]: von [-1], Größe [-1]: Parse Fehler [fehlgeschlagen analysiere Quelle [{"query": {"multi_match": {"Abfrage": {"_ index": "hugetestindex", "_ type": "doc", "_ id": "57", "_ score": 3.877801, " _source ": {" ymme ":" bourne supremacy "}}," Felder ": [" content "," title "]," operator ":" und "}}," size ": 100," from ": 0 , "Hervorhebung": {"fields": {"title": {"Nummer_der_Fragmente": 0}, "Inhalt": {"Nummer_der_Fragmente": 10, "Fragment_Größe": 300}}}]]

UPDATE 2Object {_index: "hugetestindex", _type: "doc", _id: "56", _score: 2.5276248, _source: Object}

Ich denke, das ist das Problem, anstelle eines Suchbegriffs, sein empfangendes "Objekt" ....?

UPDATE 3 Also im Grunde geht es so,

[Object, Object, Object, Object, Object] 
0: Object 
    _id: "229" 
    _index: "hugetestindex" 
    _score: 3.3071127 
    _source: Object 
     ymme: "bourne supremacy" 
     __proto__: Object 
     _type: "doc" 
    __proto__: 
Object1: 
Object2: 
Object3: 
Object4: 
Object 
    length: 5 
__proto__: Array[0] 

wobei „Bourne“ den Wert des ymme Feldes im _Source Objekt ist, an der Spitze das Array mit den 5-Objekten ist die es Rückkehr, es_return.hits.hits - dieser letzte Treffer, ist das Array.

+0

Kannst du deinen Fehler eingeben? Erhalten Sie auch den Fehler, wenn Sie etwas in Ihr Eingabefeld für den Typeahead eingeben oder wenn Sie etwas aus dem Typeahead auswählen? –

+0

@VishalRao bitte UPDATE oben, der Fehler tritt nur auf, wenn ich aus der AutoVervollständigen Begriffe auswählen – user3125823

+0

Kannst du in eine console.log() innerhalb von search(), um den Begriff als Parameter angezeigt zu sehen? Ich denke, dass das Problem dort liegen kann. –

Antwort

0

Die Art und Weise Sie Ihr Objekt dekonstruieren ist durch so etwas wie die folgenden Aktionen ausführen: ist nur eine Notation

object.data.hits.hits._source.field_name; 

Die oben den Wert eines einzelnen Feldes zu erhalten, müssen Sie möglicherweise eine Schleife für jede tun diese Werte so vielleicht so etwas wie:

$scope.list = [] 
for hit in object.data.hits.hits { 
    $scope.list.push(hit._source.field); 
} 
console.log(list); 

Dann von Ihrem HTML wollen Sie diese Liste verwenden, indem eine ng-Wiederholung mit ihm oder etwas ähnlichem zu tun jeden der Begriffe in der Liste zu bekommen.

<div ng-repeat="term in list">{{term}}</div> 

Wenn Sie Ihre Frage mit aktualisieren können, wie Ihr Objekt aussieht und welche Daten Sie von ihm wollen, kann ich diese Antwort aktualisieren es genau entsprechen.

UPDATE Um Ihre Datenstruktur anzupassen, nehme ich an, dass Sie jeden der Ymme-Werte aus diesen Objekten extrahieren möchten.Sie müssen folgendes tun:

<div ng-repeat="object in es_return.hits.hits"> 
    {{object._source.ymme}} 
</div> 

So stellen Sie sicher, dass "es_return" ist ein $ scope Variable, so dass Sie es wie oben oder einfach nur tun zugreifen:

$scope.es_return = es_return; 

In Ihrem Angular Code

+0

Bitte schauen Sie auf UPDATE 3 oben, das ist die Objektstruktur, vielen Dank! – user3125823

+0

Bitte schauen Sie auf UPDATE 3, wenn Sie können, danke – user3125823

+0

genial, vielen Dank! – user3125823

Verwandte Themen