【问题标题】:Conditional queries for ElasticSearch 5.x (elasticsearch-rails/elasticsearch-model)ElasticSearch 5.x (elasticsearch-rails/elasticsearch-model) 的条件查询
【发布时间】:2017-05-13 17:19:47
【问题描述】:

刚接触 ElasticSearch,我想知道是否有办法构建条件查询/过滤器。我正在使用 Rails,所以我想它必须在那个特定的级别上,因为我找不到任何指向 ES 级别的条件查询的东西,我很确定只是假设是愚蠢的!

所以这是我的(工作)查询:

search_definition = {
      query: {
          bool: {
              must: [
                  {
                      more_like_this: {
                          fields: tag_types,
                          docs: [
                              {
                                  _index: self.class.index_name,
                                  _type: self.class.document_type,
                                  _id: id
                              }
                          ],
                          min_term_freq: 1
                      }
                  }
              ],
              should: [
                  range: {
                      age: {
                          gte: min_age,
                          lte: max_age,
                          boost: 4.0
                      }
                  }
              ],
              filter: {
                  bool: {
                      must: [
                          term: {
                              active: true
                          }
                      ],
                      must: [
                          geo_distance: {
                              distance: xdistance,
                              unit: "km",
                              location: {
                                  lat: xlat,
                                  lon: xlng
                              },
                              boost: 5.0
                          }
                      ]
                  }
              }
          }
      },
      size: how_many
  }

而且它工作得非常好。现在假设我想应用额外的过滤器,在这个特定的示例中,我需要验证正在搜索的用户何时,另一端的用户实际上正在为正在搜索的人寻找一个性别的人。这保存在数据库中的 2 个单独的布尔属性中(男性/女性)。我认为准备两个类似的过滤器会很简单——但是,查询中还有一些条件过滤器,最终我会得到十多个预先准备好的过滤器。一定有更优雅的方式!谢谢!

【问题讨论】:

    标签: ruby-on-rails elasticsearch elasticsearch-5 elasticsearch-rails


    【解决方案1】:

    你熟悉elasticsearchsearch templates吗?
    使用搜索模板,您可以进行 conditionaldynamic 查询。例如,您可以有一个字段和值列表来进行术语过滤并将其作为参数传递给搜索模板。

    【讨论】:

    • 这看起来确实很有趣。我昨天开始在 Rails 中使用 JBuilder 设置东西,我花了很长时间才让它有点工作 - 所以我可能暂时坚持使用它,并在未来几天继续探索模板 :) 对于其他人可能会读到这个 ​​- 当事情发生时变得复杂 JBuilder 不一定是一个令人愉快的工具!
    【解决方案2】:

    按照 Mohammad 的建议 - 最后,我寻求使用 ES 搜索模板的解决方案,这让我的生活变得更轻松。 JBuilder、ElasticSearch-DSL 和其他解决方案的问题在于它们似乎不适用于最新的 ES,因此,我不确定如果对 gem 或 ES 版本进行任何更改,我最终会去哪里。因此,将中间人排除在外并使用实际上超级容易创建的模板完全控制对我来说很有意义。我使用 JBuilder 和 ES-DSL 设置的版本从未正常工作,因为它们的输出充其量是随机的。

    搜索模板 -> More Information

    JBuilder -> More Information

    ElasticSearch-DSL -> More Information

    我还没有尝试过其他解决方案,但是对于搜索模板,我认为没有任何需要。

    【讨论】:

      猜你喜欢
      • 2018-08-07
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多