php - 使用 bool 的 Elasticsearch 过滤器查询返回无效结果

标签 php laravel-4 elasticsearch

我在 Laravel 中使用 Elasticsearch 。

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

$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 AND
  • 字段“类型”必须为 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
        ]
    ));
    

    因此,这仅添加了“公共(public)”一词。
    它的作用是:
  • 在所有字段中搜索 $query AND
  • 字段“类型”必须为 11 和
  • 字段“public”必须为 1

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

    那么如何编写我需要的查询呢? $查询+类型+公共(public)

    官方文档无法回答我的问题。

    有什么建议吗?

    最佳答案

    这是你的麻烦点:

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

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

    我怀疑你必须做的是:
                        'must' => [
                            [
                                'term' => [
                                    'type' => 11
                                ]
                            ],
                            [
                                'term' => [
                                    'public' => 1
                                ]
                            ]
                        ]
    

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

    关于php - 使用 bool 的 Elasticsearch 过滤器查询返回无效结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28606467/

    相关文章:

    php - 非默认守卫在 Laravel 5.5 中被忽略

    php - 使用 artisan 迁移 Laravel 数据库

    javascript - 为什么我的 crypto.createHmac() 会为相同的输入生成不同的 HMAC?

    javascript - XMLHttpRequest 不发送 POST 数据

    php - Laravel 查询生成器 - 通过修改后的 where 语句重用查询

    php - Laravel 原始数据库插入受影响的行

    php - 为什么我会收到 Laravel 4 错误 : "User must implement Remindable interface"

    elasticsearch - 如何在Elasticsearch中选择合适的分析器

    node.js - 为什么 ElasticSearch 匹配查询返回所有结果?

    go - 如何在Elasticsearch中基于输入字段获取字段的总和值(输入字段和总和输出字段不同)