【问题标题】:Elastic Search deleteByQuery multiple termsElastic Search deleteByQuery 多个词条
【发布时间】:2015-02-07 19:41:27
【问题描述】:

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

我正在尝试这个:

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

假设是 DELETE FROM users WHERE field1 = $this->field1 AND field2 = $this->field2...

我在将 WHERE AND 语法转换为 Elastic Search 时遇到问题。

有什么帮助吗?

【问题讨论】:

  • 使用bool 查询来组合条款。
  • 我想我现在已经过火了。我有身体 => 查询 => 过滤器 => 过滤 => 布尔 => 必须 => 术语、术语、术语。我需要过滤器 => 过滤后的数组吗?
  • 你不需要过滤器。有一个没有过滤器的布尔查询:elasticsearch.org/guide/en/elasticsearch/reference/current/…
  • 很酷,谢谢!它有效。

标签: php mysql laravel elasticsearch


【解决方案1】:

您的第二条评论大部分是正确的:

我想我现在已经过火了。我有身体 => 查询 => 过滤器=>过滤=>布尔=>必须=>术语,术语,术语。我需要 filter => 过滤后的数组?

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

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

您的查询应如下所示:

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

【讨论】:

    猜你喜欢
    • 2018-11-27
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2021-01-17
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多