2014-07-17 164 views
10

我想搜索我的數據庫,並能夠使用大寫/小寫過濾條件,但我注意到,而query的應用分析器,我無法弄清楚如何應用小寫分析器在過濾的搜索。這裏的查詢:Elasticsearch小寫過濾器搜索

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

我有一個類型languages,我已經使用小寫:

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

和相應的映射:

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

回答

7

的問題是,你有一個字段您在索引過程中分析了小寫字母,但是您對未分析的查詢使用了詞條過濾器:

具有包含一個項(不分析)領域

期限篩選

過濾器文件。 與術語查詢類似,但它充當過濾器。

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

我會嘗試使用查詢過濾器來代替:

查詢過濾器

裹的任何查詢被用作過濾器。可以放在接受過濾器的查詢 中。

例子:

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

所以,如果我想壽長期被小寫我會改變該標記者以一個小寫的一個重新索引一切? – Maruf

+0

不,它由於小寫字母過濾器而在索引期間已經小寫了。問題是你需要使用一個查詢類型,也將分析 - 條款過濾器不。 –

+2

如果您只是降低了輸入的分辨率,您會看到更好的性能,因此您可以繼續使用使用查詢過濾器的術語過濾器嗎? – odyth