2015-12-28 16 views
11

Ich habe ein Problem mit einer elasticsearch Abfrage. Ich möchte in der Lage sein, die Ergebnisse zu sortieren, aber elasticsearch ignoriert das Sortier-Tag. Hier meine Anfrage:Elasticsearch sortiert die Ergebnisse nicht

Allerdings, wenn ich den Abfrageteil entfernen und ich sende nur das Sortier-Tag, funktioniert es. Kann mir jemand den richtigen Weg zeigen?

Ich habe auch versucht mit der folgenden Abfrage, die die vollständige Abfrage ist, die ich habe:

{ 
    "sort": [{ 
    "title": {"order": "asc"} 
    }], 
    "query":{ 
    "bool":{ 
     "should":[ 
     { 
      "match":{ 
      "title":{ 
       "query":"Pagos", 
       "boost":9 
      } 
      } 
     }, 
     { 
      "match":{ 
      "description":{ 
       "query":"Pagos", 
       "boost":5 
      } 
      } 
     }, 
     { 
      "match":{ 
      "keywords":{ 
       "query":"Pagos", 
       "boost":3 
      } 
      } 
     }, 
     { 
      "match":{ 
      "owner":{ 
       "query":"Pagos", 
       "boost":2 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

Einstellungen

{ 
    "settings": { 
    "analysis": { 
     "filter": { 
     "autocomplete_filter": { 
      "type": "ngram", 
      "min_gram": 3, 
      "max_gram": 15, 
      "token_chars": [ 
      "letter", 
      "digit", 
      "punctuation", 
      "symbol" 
      ] 
     } 
     }, 
     "analyzer": { 
     "default" : { 
      "tokenizer" : "standard", 
      "filter" : ["standard", "lowercase", "asciifolding"] 
     }, 
     "autocomplete": { 
      "type": "custom", 
      "tokenizer": "standard", 
      "filter": [ 
      "lowercase", 
      "asciifolding", 
      "autocomplete_filter" 
      ] 
     } 
     } 
    } 
    } 
} 

Mappings

{ 
    "objects": { 
    "properties": { 
     "id":    { "type": "string", "index": "not_analyzed" }, 
     "type":   { "type": "string" }, 
     "title":   { "type": "string", "boost": 9, "analyzer": "autocomplete", "search_analyzer": "standard" }, 
     "owner":   { "type": "string", "boost": 2 }, 
     "description": { "type": "string", "boost": 4 }, 
     "keywords":  { "type": "string", "boost": 1 } 
    } 
    } 
} 

Dank im Voraus!

+0

Welche Ergebnisse erhalten Sie, und was erwarten Sie? Bitte zeigen Sie auch, wie Sie Ihre Anfrage senden (curl, Java, Python, Sense, etc)? – Val

+0

Danke, ich benutze Python (http://elasticsearch-dsl.readthedocs.org/en/latest/). Das Problem ist, dass elasticsearch immer dieselben Ergebnisse liefert. Der Abfrageteil funktioniert einwandfrei, gibt jedoch die gleiche Liste für asc- und desc-Befehle zurück. –

+0

Können Sie den verwendeten Python-Code anzeigen? – Val

Antwort

14

Das Feld „title“ in Ihrem Dokument ist ein String-Feld analysiert, die auch ein mutivalued Feld, das Elasticsearch bedeutet, wird der Inhalt des Feldes in Token und speichert sie separat in den Index aufgespalten . Wahrscheinlich möchten Sie das Feld "title" alphabetisch nach dem ersten Begriff, dann nach dem zweiten Begriff usw. sortieren, aber elasticesearch verfügt nicht über diese Informationen zur Zeit der Sortierung.

Somit können Sie Ihre Abbildung des "title" Feld ändern:

{ 
    "title": { 
    "type": "string", "boost": 9, "analyzer": "autocomplete", "search_analyzer": "standard" 
    } 
} 

in eine Mehrfelder Mapping wie folgt aus:

{ 
    "title": { 
    "type": "string", "boost": 9, "analyzer": "autocomplete", "search_analyzer":"standard", 
    "fields": { 
     "raw": { 
     "type": "string", 
     "index": "not_analyzed" 
     } 
    } 
    } 
} 

Jetzt Ihre Suche auf analysiert basierend execute"title" Feld und Sortierung basierend auf der not_analyzed"title.raw" Feld

{ 
    "sort": [{ 
     "title.raw": {"order": "desc"} 
    }], 
    "query":{ 
     "term": { "title": "pagos" } 
    } 
} 

Es schön hier erklärt: String Sorting and Multifields

+0

Danke. Das ist genau das Problem. Jetzt funktioniert es wie es soll. Du hast meinen Tag gerettet!. –

Verwandte Themen