2014-07-17 121 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