使用'和'的过滤器的elasticsearch语法错误和'或'

时间:2014-04-01 17:45:54

标签: elasticsearch

我正在尝试使用elasticsearch执行过滤器,并且遇到语法错误,我似乎无法纠正。我测试了各个类,它们似乎工作正常。我究竟做错了什么?

这里的目的是找到满足三个同时条件的文档:(field1 == VAL1)(field2 == VAL2)((field3 == VAL3) || (field3 == VAL4))

我得到的信息是:

  

"嵌套:QueryParsingException [[xxxx]无法解析];嵌套:   JsonParseException [意外的字符(':'(代码58)):期待   逗号分隔ARRAY条目\ n在[来源:[B @ 1acfee60;行:13,   专栏:26]]; }]""状态" 400}"

谢谢!

curl -XGET 'localhost:9200/xxxx/yyyy/_search' -d '
{
    "query":
    {
        "filtered":
        {
            "filter":
            {
                "and":
                [
                    { "term": { "field1":"VAL1" } },
                    { "term": { "field2":"VAL2" } },
                    "or":
                    [
                        { "term": { "field3":"VAL3" } },
                        { "term": { "field3":"VAL4" } }
                    ]
                ]
            }
        }
    }
}
'

感谢Paige Cook,语法错误现在消失了(见下文)。但是过滤器仍然与文档不匹配。我已经测试了"和"条款和"或"条款分开,他们都工作。我很困惑。

curl -XGET 'localhost:9200/xxxx/users/_search' -d '
{
    "query":
    {
        "filtered":
        {
            "filter":
            {
                "and":
                [
                    { "term": { "field1":"VAL1" } },
                    { "term": { "field2":"VAL2" } }
                ],
                "or":
                [
                    { "term": { "field3":"VAL3" } },
                    { "term": { "field3":"VAL4" } }
                ]
            }
        }
    }
}
'

非常感谢Geert-Jan。最后的工作示例是:

curl -XGET 'localhost:9200/xxxx/yyyy/_search' -d '
{
    "query":
    {
        "filtered":
        {
            "filter":
            {
                "and":
                [
                    { "term": { "field1":"VAL1" } },
                    { "term": { "field2":"VAL2" } },
                    {
                        "or":
                        [
                            { "term": { "field3":"VAL3" } },
                            { "term": { "field3":"VAL4" } }
                        ]
                    }
                ]
            }
        }
    }
}
'

2 个答案:

答案 0 :(得分:2)

小心括号!

基本过滤器在这种情况下只能包含1个过滤器and。在该复合过滤器中,您应该有2个基本过滤器(term})和复合过滤器or

这是(未经测试)

curl -XGET 'localhost:9200/xxxx/users/_search' -d '
{
    "query":
    {
        "filtered":
        {
            "filter":
            {
                "and":
                [
                    { "term": { "field1":"VAL1" } },
                    { "term": { "field2":"VAL2" } },
                    {
                        "or":
                        [
                            { "term": { "field3":"VAL3" } },
                            { "term": { "field3":"VAL4" } }
                        ]
                    }
                ]
            }
        }
    }
}

答案 1 :(得分:1)

根据您在上面发布的json查询,您在],条目之后和之前错过了"or:""and""or"数组需要单独定义。

试试这个:

curl -XGET 'localhost:9200/xxxx/yyyy/_search' -d '
{
    "query":
    {
        "filtered":
        {
            "filter":
            {
                "and":
                    [
                        { "term": { "field1":"VAL1" } },
                        { "term": { "field2":"VAL2" } }
                    ],
                "or":
                    [
                        { "term": { "field3":"VAL3" } },
                        { "term": { "field3":"VAL4" } }
                    ]
                ]
            }
        }
    }
}