Search code examples
ruby-on-railselasticsearchelasticsearch-5elasticsearch-rails

Conditional queries for ElasticSearch 5.x (elasticsearch-rails/elasticsearch-model)


New to ElasticSearch and I was wondering if there is a way to construct conditional queries/filters. I am working with Rails, so I suppose it has to be on that particular level, as I couldn't find anything that points to conditional queries at ES-Level and I am pretty sure it was silly just to assume!

So here is the (working) query I have:

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
  }

And it works perfectly fine. Now let's assume I'd like to apply additional filters, in this particular example I need to verify when the user who is searching, that the users on the other end are, in fact, looking for a person of gender for whoever is searching. This is held in 2 separate boolean attributes in the database (male/female). I thought it would be simple enough to prepare two similar filters - however, there are a few more conditional filters that run into the queries, and I would eventually end up with more than ten pre-prepared filters. There must be a more elegant way! Thank you!


Solution

  • Are you familiar with elasticsearch search templates?
    Using search templates you can have conditional and dynamic queries. for example you can have a list of fields and values to do terms filter and pass it to search template as a parameter.