Elasticsearch,匹配Array中Array的任何可能的精确值

时间:2016-09-19 21:31:59

标签: elasticsearch

我想查询符合以下任何值的所有文档:

["Test","Cat","Dog"]

在字段类别中。

我有以下映射:

"categories": {
    "type": "string"
}

有几个示例文档

"categories": [
    "Test",
    "Cat"
]

或者

"categories": [
    "Blue Cat",
    "Ball"
]

我能够通过以下查询将其拉出来:

query: {
    match: {
        categories: {
            query: ["Test","Cat","Dog"]
        }
    }

但这会让我回复两份文件,因为它们都包含了#34; Cat"即使其中一个以“蓝猫”#34;的形式包含它,我怎么能指定他们我想要的确切价值" Cat"不是它包括它吗?

我读过有关将映射的字段类型更改为嵌套的内容,但是不接受数组作为嵌套对象,因为它没有键和值。

如果我使用此映射:

"categories": {
    "type": "nested"
}

我收到此错误:

"object mapping for [categories] tried to parse field [null] as object, but found a concrete value"

如何使用可能值的数组按字段类别进行过滤,并确保它至少与其中一个值匹配?

1 个答案:

答案 0 :(得分:6)

将字段更改为“not_analyzed”。现在它使用默认的“标准”分析器,将“Blue Cat”分成两个标记“Blue”和“Cat”,这就是为什么你的查询与包含“Blue Cat”的文档相匹配的原因。

这是映射

{
"categories": {
    "type":     "string",
    "index":    "not_analyzed"
}}

我使用上面的映射索引了两个文档。

{
_index : "test_index",
_type : "test",
_id : "2",
_score : 1,
_source : {
    categories : [
        "Blue Cat",
        "Ball"
    ]
}}, {
_index : "test_index",
_type : "test",
_id : "1",
_score : 1,
_source : {
    categories : [
        "Test",
        "Cat"]
}}]}

我使用以下模板搜索

{
"query" : {
    "constant_score" : {
        "filter" : {
            "terms" : { 
                "categories" :["Test","Cat","Dog"]
            }
        }
    }
}}

我只收到第一份文件

{
"took" : 9,
"timed_out" : false,
"_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
},
"hits" : {
    "total" : 1,
    "max_score" : 1,
    "hits" : [{
            "_index" : "test_index",
            "_type" : "test",
            "_id" : "1",
            "_score" : 1,
            "_source" : {
                "categories" : [
                    "Test",
                    "Cat"
                ]
            }
        }
    ]
}}