2014-12-04 7 views
7

Ich habe ein Feld in Elasticsearch mit dem Wert "PEI.H.02354.01.". Als ich suche mit querystring alsElasticsearch Suche scheitert in Feld mit Sonderzeichen und Platzhalter

{ 
    "query":{ 
     "query_string":{ 
     "query":"field:PEI.H.02354.01.", 
     "default_operator":"AND" 
     } 
    } 
} 

dann ein Ergebnis zurückgegeben wird, was das richtige Verhalten ist. Wenn ich jedoch mit einem Platzhalter suche, werden keine Ergebnisse zurückgegeben, z.

{ 
    "query":{ 
     "query_string":{ 
     "query":"field:PEI.H.02354.01.*", 
     "default_operator":"AND" 
     } 
    } 
} 

Das Feld ist vom Typ string und wird analysiert. Im Folgenden finden Sie den Code, der den Index erstellt, einschließlich des Analysators und der Zuordnungen.

{ 
    "settings":{ 
     "analysis":{ 
     "analyzer":{ 
      "number":{ 
       "type":"custom", 
       "tokenizer":"keyword", 
       "filter":[ 
        "lowercase" 
       ], 
       "char_filter":[ 
        "number_filter" 
       ] 
      }, 
      "diacritical":{ 
       "type":"custom", 
       "tokenizer":"standard", 
       "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "nfd_normalizer" 
       ] 
      } 
     }, 
     "filter":{ 
      "nfd_normalizer":{ 
       "type":"icu_normalizer", 
       "name":"nfc" 
      } 
     }, 
     "char_filter":{ 
      "number_filter":{ 
       "type":"pattern_replace", 
       "pattern":"[^\\d]+", 
       "replacement":"" 
      } 
     } 
     } 
    }, 
    "mappings":{ 
     "testType":{ 
     "_source":{ 
      "enabled":false 
     }, 
     "_all":{ 
      "enabled":false 
     }, 
     "_timestamp":{ 
      "enabled":"true", 
      "store":"yes" 
     }, 
     "properties":{ 
      "field":{ 
       "store":"yes", 
       "type":"string", 
       "index":"analyzed", 
       "analyzer":"diacritical" 
      } 
     } 
    }  
} 

Schließlich wird ein Probeneinsatz

{ 
    field: "PEI.H.02354.01." 
} 

Hat jemand eine Ahnung, warum dies geschieht und wie diese zu lösen?

Antwort

8

Siehe query_string Dokumentation:

wildcarded Begriffe nicht standardmäßig analysiert werden - sie sind klein geschrieben (lowercase_expanded_terms standardmäßig true), aber keine weitere Analyse wird

getan

Ihre gespeicherten Daten in zwei Begriffe gebrochen wird:

curl -XGET 'localhost:9200/myindex/_analyze?analyzer=diacritical&pretty' -d 'PEI.H.02354.01' 
{ 
    "tokens" : [ { 
    "token" : "pei.h", 
    "start_offset" : 0, 
    "end_offset" : 5, 
    "type" : "<ALPHANUM>", 
    "position" : 1 
    }, { 
    "token" : "02354.01", 
    "start_offset" : 6, 
    "end_offset" : 14, 
    "type" : "<NUM>", 
    "position" : 2 
    } ] 
} 

aber als Suchbegriff mit einem Platzhalter wird nur in pei.h.02354.01.* dreht sie nicht übereinstimmen.

jedoch mit analyze_wildcard Satz zu wahr, Sie Treffer zu tun bekommen:

curl -XGET "http://localhost:9200/myindex/testType/_search?pretty" -d' 
> { 
> "query":{ 
>  "query_string":{ 
>   "query":"field:PEI.H.02354.01.*", 
>   "default_operator":"AND", 
>   "analyze_wildcard": true 
>  } 
> } 
> }' 
{ 
    "took" : 5, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 2, 
    "max_score" : 1.4142135, 
+0

Mit diesem in der Tat Ergebnisse liefert, aber nicht alle von ihnen richtig sind, z.B. Ich bekomme auch PEI.H.4545.01. Dies ist sinnvoll, wenn, wie Sie gesagt haben, der Suchbegriff analysiert wird und grundsätzlich nach dem gesucht wird, was ES sucht. Pei.h OR 02354.01. Aber gibt es einen Weg, dies zu vermeiden und nach PEI.H.02354.01 zu suchen. als Ganzes, anstatt es in zwei Begriffen zu brechen? – dchar

+0

Es klingt, als ob Sie PEI.H.02354.01 als eine einzige Zeichenfolge behandeln möchten - falls dies erforderlich ist, müssen Sie Ihren Analysator ändern, z. nur auf Leerzeichen tokenisieren. –

+0

Möglicherweise für diese Art der Suche sollten Sie ein Multi-Feld mit einem anderen Analysator verwenden. –

Verwandte Themen