ruby - 如何在Elasticsearch中结合3个术语?

标签 ruby elasticsearch elasticsearch-dsl

我得到一个搜索,需要对用户组合三个不同的术语:
user_locked? || (user_expired? && !user_granted?)
这是我现在得到的,但是会引发错误消息:

query do
  bool do
    must { match_all {} }
    filter do
      bool do
        should { term(user_locked: true) }
        minimum_should_match { 1 }
      end
      bool do
        filter do
          term(user_expired: true)
          term(user_granted: false)
        end
      end
    end
  end
end

错误信息:
NoMethodError: undefined method 'filter' for #<Elasticsearch::DSL::Search::Filters::Bool
任何想法如何解决这个问题,甚至更好的查询?

最佳答案

尝试这样:

query do
  bool do
    minimum_should_match 1
    should do
      term(user_locked: true)
    end
    should do
      bool do
        must do
          term(user_expired: true)
        end
        must do
          term(user_granted: false)
        end
      end
    end
  end
end

更新

根据您的第二条评论,我们需要否定您的条件,即
!(user_locked? || (user_expired? && !user_granted?))
现在等于
!user_locked? && (!user_expired? || user_granted?)
转化为
query do
  bool do
    must do
      term(user_locked: false)
    end
    must do
      bool do
        minimum_should_match 1
        should do
          term(user_expired: false)
        end
        should do
          term(user_granted: true)
        end
      end
    end
  end
end

该查询现在将按预期返回带有user_locked: false, user_expired: false的文档

关于ruby - 如何在Elasticsearch中结合3个术语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42832835/

相关文章:

ruby-on-rails - 在 Rails 中使用 View 检查数组

elasticsearch - Elasticsearch未创建从Logstash输出文件接收的索引

python - Django elasticsearch-dsl在pre_save上更新M2M

elasticsearch-dsl - elasticsearch_dsl : Generate multiple buckets in aggregation

ruby - 捕获用于日志记录的 Ruby 异常,但不抛出它?

Ruby openssl 文档

ruby - 如何从 Gemfile 安装 gems?

elasticsearch - 如何使用 elasticsearch 5.2.1 配置 Spring Boot?

elasticsearch - Elasticsearch中的嵌套计数聚合

python - 通过 ElasticSearch DSL python 包装器创建索引时如何在索引级别设置 ignore_malformed?