如何在CloudSearch中查询列表或数组中包含多个值的文档?

时间:2016-10-26 20:07:41

标签: amazon-web-services amazon-dynamodb amazon-cloudsearch

示例文档:

{
    "name":"Bob Belcher",
    "children":[
        "Tina",
        "Louise",
        "Gene"
    ]
}

我想通过询问找到一份文件: 包含儿童"蒂娜"并包含儿童"路易斯"

同样我该怎么做: 包含儿童"蒂娜"并且不包含儿童"杰克"

这可以用子对象而不是字符串来完成吗? 包含名字=" Tina" AND包含名称=" Louise"

的孩子

示例文档:

{
    "name":"Bob Belcher",
    "children":[
        {
            "name":"Tina"
        },
        {
            "name":"Louise"
        },
        {
            "name":"Gene"
        }
    ]
}

还有一个,我们可以做多层深层次吗?

{
    "name":"Bob Belcher",
    "children":[
        {
            "name":"Tina",
            "pets":[
                "Spot",
                "Snowball"
            ]
        },
        {
            "name":"Louise",
            "pets":[
                "Liz"
            ]
        },
        {
            "name":"Gene"
        }
    ]
}

我能问一些类似的话: 包含含有宠物的孩子" Spot" AND包含包含宠物的孩子" Snowball"

1 个答案:

答案 0 :(得分:0)

1)属性children定义为SET Dynamodb数据类型,可以使用CONTAINSNOT CONTAINS进行过滤。例如: -

FilterExpression: "  contains (product, :productSet) AND not contains (product, :productSetNotContains)",
    ExpressionAttributeValues : {
        ':key1' : 2016,
        ':titleval' :  "The Big New Movie 1",
        ':productSet' : "milk",
        ':productSetNotContains' : "egg"

    }

2)属性children定义为LIST DynamoDB数据类型,可以使用CONTAINS进行过滤。

var childrenTina = {"name":"Tina"};
var childrenLouise = {"name":"Louise"};

FilterExpression: "  contains (children, :childrenTina) AND contains (children, :childrenLouise)   ",
    ExpressionAttributeValues : {
        ':key1' : 2016,
        ':titleval' :  "The Big New Movie 1",
        ':childrenTina' : childrenTina,
        ':childrenLouise' : childrenLouise

    }

3)对于深度分层的数组,如果元素的整个值已知,则可以使用CONTAINS进行过滤,即为了匹配Tina,还需要Pets属性的值。

在DynamoDB术语中,以下结构意味着存在MAP inside LIST,即LIST中的每个元素都是MAP。只要整个MAP数据可用,CONTAINS函数就可用于过滤数据。

"name":"Tina",
            "pets":[
                "Spot",
                "Snowball"
            ]