ElasticSearch - 在一个查询中搜索已分析且未分析的multi_field

时间:2013-09-20 22:01:30

标签: elasticsearch

我有一个索引字段'properties.language',其值为'en sv'。该字段有一个multi_field映射,由两个字段组成,一个分析(名称'language'),另一个not_analyzed(name'_exact')。

如何在不查询'properties.language'和'properties.language._exact'的情况下发出单个搜索查询?

修改

这是我的配置:

索引数据:

{
    "_index": "51ded0be98035",
    "_type": "user",
    "_id": "WUzwcwhTRbKur7J5ZY_hgA",
    "_version": 1,
    "_score": 1,
    "_source": {
        "properties": {
            "language":"en sv"
        }
    }
}

“用户”类型的映射:

{
    "user": {
        "properties": {
            "properties": {
                "properties": {
                    "language": {
                        "type": "multi_field",
                        "fields": {
                            "language": {
                                "type": "string",
                                "analyzer": "standard",
                                "index": "analyzed"
                            },
                            "_exact": {
                                "type": "string",
                                "index": "not_analyzed"
                            }
                        }
                    }
                }
            }
        }
    }
}

搜索查询:

{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "bool": {
                    "must": [{
                        "or": [{
                            "term": {
                                "properties.language": "en sv"
                            }
                        }, {
                            "term": {
                                "properties.language._exact": "en sv"
                            }
                        }]
                    }]
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

考虑使用Elasticsearch内置多值字段(即数组)来索引language字段:http://www.elasticsearch.org/guide/reference/mapping/array-type/。就像您目前一样,将index设置为not_analyzed

在为数据编制索引而不是单个值'en sv'时,请改为['en', 'sv'],而ES将负责其余的工作。

对于查询,您可以执行以下操作来查找同时包含ensv的项目:

{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "bool": {
                    "must": [{
                        "term": {
                            "properties.language": "en"
                        }
                    }, {
                        "term": {
                            "properties.language": "sv"
                        }
                    }]
                }
            }
        }
    }
}

甚至更好,使用terms查询/过滤器代替term找到更大的简洁/灵活性:http://www.elasticsearch.org/guide/reference/query-dsl/terms-query/