2014-07-17 19 views
10

Ich versuche meine Datenbank zu durchsuchen und in der Lage sein, Groß/Kleinschreibung Filterausdrücke zu verwenden, aber ich habe festgestellt, während query 's anwenden Analysatoren, kann ich nicht herausfinden, wie man einen Kleinbuchstaben Analysator anwenden auf einer gefilterten Suche. Hier ist die Abfrage:Elasticsearch Kleinbuchstaben Filter Suche

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "bool": { 
        "should": [ 
         { 
          "term": { 
           "language": "mandarin" // Returns a doc 
          } 
         }, 
         { 
          "term": { 
           "language": "Italian" // Does NOT return a doc, but will if lowercased 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 

ich einen Typ haben languages, die ich verwendet haben kleingeschrieben:

"analyzer": { 
    "lower_keyword": { 
     "type": "custom", 
     "tokenizer": "keyword", 
     "filter": "lowercase" 
    } 
} 

und eine entsprechende Abbildung:

"mappings": { 
    "languages": { 
     "_id": { 
      "path": "languageID" 
     }, 
     "properties": { 
      "languageID": { 
       "type": "integer" 
      }, 
      "language": { 
       "type": "string", 
       "analyzer": "lower_keyword" 
      }, 
      "native": { 
       "type": "string", 
       "analyzer": "keyword" 
      }, 
      "meta": { 
       "type": "nested" 
      }, 
      "language_suggest": { 
       "type": "completion" 
      } 
     } 
    } 
} 

Antwort

7

Das Problem ist, dass Sie ein Feld haben, die Sie haben den Index während des Index analysiert, um ihn in Kleinbuchstaben zu schreiben, aber Sie verwenden einen Termfilter für die Abfrage, der nicht analysiert wird:

Zeitfilter

Filter Dokumente, die Felder aufweisen, die eine Laufzeit (nicht analysiert) enthalten. Ähnlich wie Begriff Abfrage, außer dass es als Filter fungiert.

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-term-filter.html

Ich würde versuchen, stattdessen eine Abfrage-Filter:

Abfragefilter

Wraps jede Abfrage als Filter verwendet werden. Kann in Abfragen platziert werden, die einen Filter akzeptieren.

Beispiel:

{ 
    "constantScore" : { 
     "filter" : { 
      "query" : { 
       "query_string" : { 
        "query" : "this AND that OR thus" 
       } 
      } 
     } 
    } } 

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-filter.html#query-dsl-query-filter

+1

Also, wenn ich tho Begriff wollte kleingeschrieben werden, würde ich die tokenizer zu einem Klein ein ändern und alles indizieren? – Maruf

+0

Nein, es ist bereits während des Indexierens aufgrund des Kleinbuchstabenfilters kleiner. Das Problem besteht darin, dass Sie einen Abfragetyp verwenden müssen, der ebenfalls analysiert wird - Termfilter nicht. –

+2

Würdest du eine bessere Leistung sehen, wenn du deine Eingabe einfach gesenkt hast, so dass du einen Termfilter weiter verwenden kannst, anstatt einen Abfragefilter zu verwenden? – odyth

Verwandte Themen