Elasticsearch小写过滤搜索

时间:2014-07-17 18:46:30

标签: search elasticsearch

我正在尝试搜索我的数据库,并且能够使用大写/小写过滤条件,但我注意到query应用分析器时,我可以'弄清楚如何在过滤搜索上应用小写分析器。这是查询:

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

2 个答案:

答案 0 :(得分:8)

问题是您在索引期间已经分析了一个字段以小写它,但是您使用的术语过滤器用于未分析的查询:

  

期限过滤

     

过滤包含字词(未分析)的字段的文档。   与术语查询类似,不同之处在于它充当过滤器。

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 :(得分:0)

这可以通过在字段中附加extension=php_mcrypt.dll来查询字段的关键字版本来实现。假设在映射中使用类型.keyword定义了语言。

请注意,现在仅精确的文本将匹配:keyword将不匹配,而mandarin将匹配。

您的查询最终将如下所示:

Italian

还可以组合术语值:

{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "should": [
                        {
                            "term": {
                                "language.keyword": "mandarin" // Returns Empty
                            }
                        },
                        {
                            "term": {
                                "language.keyword": "Italian" // Returns Italian.
                            }
                        }
                    ]
                }
            }
        }
    }
}