3

我有一个索引字段“properties.language”,其值为“en sv”。此字段有一个 multi_field 映射,它由两个字段组成,一个已分析(名称“语言”),一个未分析(名称“_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"
                            }
                        }]
                    }]
                }
            }
        }
    }
}
4

1 回答 1

3

language考虑使用 Elasticsearch 内置的多值字段(即数组)来索引字段: http ://www.elasticsearch.org/guide/reference/mapping/array-type/ 。正如您目前所做的那样,设置indexnot_analyzed.

当索引你的数据时,而不是单个 value 'en sv', pass instead ['en', 'sv'],ES 将处理其余的事情。

对于查询,这使您能够执行以下操作来查找同时具有en和的项目sv

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

或者更好的是,使用terms查询/过滤器而不是termhttp ://www.elasticsearch.org/guide/reference/query-dsl/terms-query/ 找到更简洁/更灵活的方法

于 2013-09-22T18:42:53.827 回答