弹性搜索deleteByQuery多个术语

时间:2014-12-09 19:15:35

标签: php mysql laravel elasticsearch

我在弹性搜索中复制MySQL删除查询时遇到问题,我正在使用此文档:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-delete-by-query.html使用Laravel的PHP包装器。

我正在尝试这个:

$this->es->deleteByQuery([
    'index' => 'users',
    'type'  => 'user',
    'body'  => [
        'query' => [
                            'term' => ['field1' => $this->field1],
                            'term' => ['field2' => $this->field2],
                            'term' => ['temp' => 0]
        ]
    ]
]);

它假设是DELETE FROM用户WHERE field1 = $ this-> field1 AND field2 = $ this-> field2 ...

我无法将WHERE AND语法翻译为弹性搜索。

任何帮助?

1 个答案:

答案 0 :(得分:0)

你的第二条评论大多是正确的:

  

我想我现在已经过火了。我有body => query =>   filter => filtered => bool =>必须=>期限,期限,期限。我需要吗?   filter =>过滤后的数组?

bool过滤器优于bool查询,因为过滤通常比查询快得多。在您的情况下,您只是过滤具有各种术语的文档,并且不希望它们对分数做出贡献,因此过滤是正确的方法。

这应该通过query子句来完成,但是,因为顶级filter子句用于不同的目的(过滤facet / aggregations ...它实际上已重命名为1.0中的post_filter表示它是“后过滤”操作)。

您的查询应如下所示:

$this->es->deleteByQuery([
    'index' => 'users',
    'type'  => 'user',
    'body'  => [
        'query' => [
            'filtered' => [
                'filter' => [
                    'must' => [
                        ['term' => ['field1' => $this->field1]],
                        ['term' => ['field2' => $this->field2]],
                        ['term' => ['temp' => 0]]
                    ]
                ]
            ]       
        ]
    ]
]);