2014-07-17 13 views
10

Sto provando a cercare nel mio database ed essere in grado di usare termini maiuscoli/minuscoli, ma ho notato che mentre gli analizzatori di query si applicano, non riesco a capire come applicare un analizzatore di lettere minuscole su una ricerca filtrata. Ecco la domanda:Ricerca filtro Elasticsearch in minuscolo

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

Ho un tipo languages che ho in minuscolo utilizzando:

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

e una mappatura corrispondente:

"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" 
      } 
     } 
    } 
} 

risposta

7

Il problema è che avete un campo che hai analizzato durante l'indice per metterlo in minuscolo, ma stai utilizzando un filtro a termine per la query che non viene analizzata:

Term Filtro

Filtri documenti contenenti campi che contengono un termine (non analizzato). Simile alla query termine, tranne che funge da filtro.

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

mi piacerebbe provare a utilizzare un filtro di query invece:

Query Filter

avvolge tutte le query da utilizzare come filtro. Può essere inserito nelle query che accettano un filtro.

Esempio:

{ 
    "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

Quindi, se ho voluto tho termine da caratteri minuscoli dovrei cambiare il tokenizzatore a uno minuscolo e reindex tutto? – Maruf

+0

No, è già in minuscolo durante l'indicizzazione a causa del filtro in minuscolo. Il problema è che devi usare un tipo di query che analizzerà anche i filtri a termine. –

+2

Vedresti prestazioni migliori se solo inserendo il valore in minuscolo in modo da poter continuare a utilizzare un filtro termini utilizzando un filtro query? – odyth

Problemi correlati