使用bool的弹性搜索过滤器查询返回无效结果

时间:2015-02-19 12:29:34

标签: php laravel-4 elasticsearch

我在Laravel中使用弹性搜索。

所以我有查询返回正确的结果:

$results = Es::search(array(
    'index' => 'testindex',
    'type' => $type,
    'body' => [
        'query' => [
            'filtered' => [
                'query' => [
                    'match' => [
                        '_all' => '2015-02'
                    ]
                ],
                'filter' => [
                    'bool' => [
                        'must' => [
                            'term' => [
                                'type' => 11
                            ]
                        ],
                    ]
                ]
            ]
        ],
        'size' => 5,
        'from' => 0
    ]
));

它的作用是:

  • 在所有字段和
  • 中搜索$ query
  • 字段“type”必须为11。

输出结果为:http://pastebin.com/icWniix4 总共9个结果是正确的。

但是当我添加另一个必须的术语时,它会返回无效结果

$results = Es::search(array(
    'index' => 'testindex',
    'type' => $type,
    'body' => [
        'query' => [
            'filtered' => [
                'query' => [
                    'match' => [
                        '_all' => '2015-02'
                    ]
                ],
                'filter' => [
                    'bool' => [
                        'must' => [
                            'term' => [
                                'type' => 11
                            ],
                            'term' => [
                                'public' => 1
                            ]
                        ],
                    ]
                ]
            ]
        ],
        'size' => 5,
        'from' => 0
    ]
));

所以这只是为“公共”添加术语。 它的作用是:

  • 在所有字段和
  • 中搜索$ query
  • 字段“type”必须为11 AND
  • 字段“public”必须为1

所以现在结果总共为429.它忽略了“类型”术语,并以“public”= 1返回所有内容。但是如果我使用MUST那么它应该匹配所有这些。搜索结果http://pastebin.com/cVcatcyi

那么如何编写我需要的查询呢? $ query + type + public

官方文件未能回答我的问题。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这是你的麻烦点:

                    'must' => [
                        'term' => [
                            'type' => 11
                        ],
                        'term' => [
                            'public' => 1
                        ]
                    ]

在这里,您将must的值指定为只有一个不同键的关联数组 - term实际上被分配了两次,因此可能只有一个分配将“存活”(大概public幸存下来,因为它出现在定义的最后)。最终结果是must最终指向只有一个键值对的关联数组。

我怀疑你必须这样做:

                    'must' => [
                        [
                            'term' => [
                                'type' => 11
                            ]
                        ],
                        [
                            'term' => [
                                'public' => 1
                            ]
                        ]
                    ]

现在must实际上是指向一个包含两个项目的数组。