2014-07-17 17 views
10

Próbuję przeszukać moją bazę danych i używać terminów filtrowania wielkich/małych liter, ale zauważyłem, że gdy stosuje się analizatory query, nie mogę wymyślić sposobu zastosowania analizatora pisanego małymi literami na przefiltrowanym wyszukiwaniu. Oto zapytanie:Elasticsearch Wyszukiwanie z małymi literami

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

mam typ languages że mam małe litery przy użyciu:

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

i odpowiedniego odwzorowania:

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

Odpowiedz

7

Problemem jest to, że masz pole, które przeanalizowałeś podczas indeksowania, aby wprowadzić małe litery, ale używasz filtru terminów dla zapytania, które nie jest analizowane:

Filtr Term

Filtry dokumentów zawierających pola, które zawierają termin (nie analizowany). Podobne do zapytania termowego, z tym że działa jak filtr.

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

Chciałbym spróbować użyć filtru zapytania zamiast:

Query Filter

Wraps każde zapytanie do stosowania jako filtr. Można umieścić w zapytaniach , które akceptują filtr.

Przykład:

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

Więc gdybym chciał tho perspektywie być małe litery chciałbym zmienić tokenizera do małymi jednym i reindex wszystko? – Maruf

+0

Nie, już jest indeksowany z powodu filtra pisanego małymi literami. Problem polega na tym, że musisz użyć typu zapytania, który również zostanie przeanalizowany - filtry terminów nie. –

+2

Czy zauważysz lepszą wydajność, jeśli po prostu wprowadzisz małe znaki wejściowe, aby można było nadal używać filtru Term za pomocą filtru zapytania? – odyth

Powiązane problemy