2014-01-27 11 views
13

Bei der Sortierung nach einem String-Feld mit mehreren Wörtern teilt Elasticsearch den String-Wert auf und verwendet min oder max als Sortierwert. I.E .: Bei Sortierung eines Feldes mit dem Wert "Auge des Tigers" in aufsteigender Reihenfolge lautet der Sortierwert: "Auge" und bei absteigender Sortierung lautet der Wert: "Tiger".Elasticsearch-Sortierung nach String liefert keine erwarteten Ergebnisse

Lets sagen, ich habe "Auge des Tigers" und "Rad des Todes" als Einträge in meinem Index, wenn ich eine aufsteigende Sortierung auf diesem Feld mache, würde ich erwarten, "Auge des Tigers" zuerst zu sein, da "E" vor "W" steht, aber was ich sehe, wenn ich auf diesem Feld sortiere, kommt "Wheel of Death" zuerst, da "D" der minimale Wert dieses Ausdrucks ist und "E" das min Wert von "Auge des Tigers".

Kann jemand dieses Verhalten abstellen und nur eine regelmäßige Sortierung für dieses Zeichenfeld zulassen?

+0

wie ist das Feld zugeordnet? Klingt wie in Stücke zerstückelt, nicht als ganze Saite analysiert. Sie benötigen möglicherweise '' '" index ":" not_analyzed "' '' – mconlin

+0

Das Feld wird als String zugeordnet. Also müsste ich das grundsätzlich für jedes Feld tun, das ich nach mehreren Begriffen sortieren wollte? Ich habe etwas mehr gegraben und stieß auf dieses: http://stackoverflow.com/questions/10583013/why-elasticsearch-not-analysed-field-is-split-into-terms, das ähnlich klingt, was Sie vorschlagen. Ist das der einzige Weg in Elasticsearch? es fühlt sich einfach ziemlich klobig an – willz

+1

Hier ist ein hilfreicher Blogbeitrag zum Thema http://awesomism.co.uk/sorting-string-fields-with-elasticsearch/ – Ryan

Antwort

10

Wie mconlin erwähnt, wenn Sie nach dem unanalyzed doc Feld sortieren möchten, müssen Sie "index" angeben: "not_analyzed", um wie beschrieben zu sortieren. Aber wenn Sie in der Lage sind, dieses Feld in Token zu halten, um zu suchen, zeigt this post durch Sloan ein großes Beispiel. Die Verwendung von multi-field, um zwei verschiedene Zuordnungen für ein Feld beizubehalten, ist in Elasticsearch sehr häufig.

Hoffe, dass dies hilft, lassen Sie mich wissen, wenn ich mehr Erklärung anbieten kann.

4

Wenn Sie möchten, dass die Sortierung die Groß- und Kleinschreibung nicht beachtet "index": "not_analyzed" nicht funktioniert, so habe ich einen benutzerdefinierten Sortieranalysator erstellt.

index settings.yml

index : 
    analysis : 
     analyzer : 
      sort : 
       type : custom 
       tokenizer : keyword 
       filter : [lowercase] 

Mapping:

... 
"articleName": { 
    "type": "string", 
    "analyzer": "standard", 
    "fields": { 
     "sort": { 
      "type": "string", 
      "analyzer": "sort" 
     } 
    } 
} 
... 
Verwandte Themen