2013-08-14 11 views
33

Ich habe ein Feld in einem ElasticSearch-Feld, das ich nicht analysiert haben möchte, ich. e. es sollte wörtlich gespeichert und verglichen werden. Die Werte enthalten Buchstaben, Zahlen, Leerzeichen, Bindestriche, Schrägstriche und möglicherweise andere Zeichen.Wie nicht in ElasticSearch analysieren?

Wenn ich in meinem Mapping für dieses Feld keinen Analysator gebe, verwendet der Standardwert immer noch einen Tokenizer, der meine wortwörtliche Zeichenfolge in Wörterklumpen hackt. Ich will das nicht.

Gibt es einen super einfachen Analysator, der im Grunde nicht analysiert? Oder gibt es eine andere Art zu bezeichnen, dass dieses Feld nicht analysiert werden soll?

Ich erstelle nur den Index, ich mache nichts anderes. Ich kann Analysatoren wie "Englisch" für andere Felder verwenden, die eingebaute Namen für vorkonfigurierte Analysatoren zu sein scheinen. Gibt es eine Liste mit anderen Namen? Vielleicht gibt es eines, das meinen Bedürfnissen entspricht (nämlich nichts mit dem Input zu tun). derzeit

Das ist mein Mapping:

{ 
    "my_type": { 
    "properties": { 
     "my_field1": { "type": "string", "analyzer": "english" }, 
     "my_field2": { "type": "string" } 
    } 
    } 
} 

my_field1 ist sprachabhängig; das scheint zu funktionieren. my_field2 soll wörtlich sein. Ich würde gerne einen Analysator geben, der einfach nichts macht.

Ein Beispielwert für my_field2 wäre "B45c 14/04".

Antwort

47
"my_field2": { 
    "properties": { 
     "title": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
    } 
} 

Überprüfen Sie hier, https://www.elastic.co/guide/en/elasticsearch/reference/1.4/mapping-core-types.html, für weitere Informationen.

+0

Ah! Das habe ich gesucht. Ich stolperte mehrmals über dieses 'not_analyzed', dachte aber immer daran, dass es überhaupt nicht durchsucht werden kann (anscheinend wird dafür" no "verwendet). Der Link zur Dokumentation war aufschlussreich, danke! (Und bei gegebener Zeit werde ich diese Antwort akzeptieren, es sei denn, es erscheint noch hilfreicher.) – Alfe

+1

@Alfe, Sie können [diese Antwort für weitere Informationen] haben (http://stackoverflow.com/questions/16911633/not-indexed-field -is-stored-in-index/16923084 # 16923084) einschließlich der Option 'index: no' – ramseykhalaf

+2

Können wir es global so einstellen, analysiert es nicht String-Typ für alle? – coderek

2

keyword Analysator kann auch verwendet werden.

// don't actually use this, use "index": "not_analyzed" instead 
{ 
    "my_type": { 
    "properties": { 
     "my_field1": { "type": "string", "analyzer": "english" }, 
     "my_field2": { "type": "string", "analyzer": "keyword" } 
    } 
    } 
} 

Wie bereits erwähnt hier: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-keyword-analyzer.html, macht es mehr Sinn, diese Felder als not_analyzed zu markieren.

Aber keyword Analysator kann nützlich sein, wenn es standardmäßig für den gesamten Index festgelegt ist.

UPDATE: Wie es in den Kommentaren gesagt wird string nicht in 5.x mehr unterstützt

+3

tatsächlich analysiert das 'Schlüsselwort'-Analysegerät das Feld, aber nur einmal als Ganzes. es ist vielleicht nicht erwünscht, wenn dies in einigen großen Textfeldern wie ~ MB-Inhalten eingestellt ist - es wird in den Index gehen und einige Ressourcen verbrauchen. – ulkas

+1

Darüber hinaus wird das Feld 'string' für die in 5.x erstellten Indizes zugunsten der Felder' text' und 'keyword' nicht unterstützt. – lifeisfoo

3

Diese nicht mehr aufgrund der Entfernung des string wahr ist (ersetzt durch keyword und ``) Typ als here beschrieben. Stattdessen sollten Sie "index": true | false verwenden. Für Beispiel OLD:

{ 
    "foo": { 
    "type" "string", 
    "index": "not_analyzed" 
    } 
} 

wird NEU:

{ 
    "foo": { 
    "type" "keyword", 
    "index": true 
    } 
} 

Dies bedeutet, dass das Feld indiziert ist, aber da es implizit als keyword nicht analysiert eingegeben wird.