0

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 个单独的布尔属性中(男性/女性)。我认为准备两个类似的过滤器会很简单——但是,查询中还有一些条件过滤器,最终我会得到十多个预先准备好的过滤器。一定有更优雅的方式!谢谢!

4

2 回答 2

1

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

于 2017-05-14T06:05:48.350 回答
1

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

搜索模板 ->更多信息

JBuilder ->更多信息

ElasticSearch-DSL ->更多信息

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

于 2017-05-14T14:16:07.880 回答