ProgLearner
ProgLearner

Reputation: 181

ElasticSearch combine conditional statements 'and' with 'or'

Purpose of the query below is to return n results for each criteria i.e. it must match partnersites 16 and match 'venueTown' or partnersites 16 and match 'venueName'. Currently it returns the results where each field must contain the same string. In my case fields: name, venueName and venueTown must contain manchester, but I want separate results for each pair {(partnersites, venueName), (partnersites, venueTown)}.

    {
    "size": 0,
    "_source": ["groupedName", "groupedDisplayName", "groupedUrl", "eventCode", "venueName", "venueTown", "venueId", "media"],
    "query": {
        "bool": {
            "must": [{
                "match": {
                    "partnersites": {
                        "query": "16"
                    }
                }
            }, {
                "match": {
                    "name": "manchester"
                }
            }, {
                "match": {
                    "venueName": "manchester"
                }
            }, {
                "match": {
                    "venueTown": "manchester"
                }
            }, {
                "match": {
                    "venueTown": "manchester"
                }
            }]
        }
    },
    "aggs": {
        "distinct_names": {
            "terms": {
                "field": "name.keyword",
                "size": 10
            },
            "aggs": {
                "top_tag_hits": {
                    "top_hits": {
                        "size": 1,
                        "_source": ["groupedName", "groupedDisplayName", "groupedUrl", "eventCode", "venueName", "venueTown", "venueId", "media"]
                    }
                }
            }
        },
        "distinct_venues": {
            "terms": {
                "field": "venueName.keyword",
                "size": 10
            },
            "aggs": {
                "top_tag_hits": {
                    "top_hits": {
                        "size": 1,
                        "_source": ["groupedName", "groupedDisplayName", "groupedUrl", "eventCode", "venueName", "venueTown", "venueId", "media"]
                    }
                }
            }
        },

        "distinct_towns": {
            "terms": {
                "field": "venueTown.keyword",
                "size": 10
            },
            "aggs": {
                "top_tag_hits": {
                    "top_hits": {
                        "size": 1,
                        "_source": ["groupedName", "groupedDisplayName", "groupedUrl", "eventCode", "venueName", "venueTown", "venueId", "media"]
                    }
                }
            }
        }
    }
}

Upvotes: 1

Views: 39

Answers (1)

hackForLife
hackForLife

Reputation: 154

Try this:

{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "partnersites": "16"
                      }
                    },
                    {
                      "match_phrase_prefix": {
                        "name": "mancheste"
                      }
                    }
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "partnersites": "16"
                      }
                    },
                    {
                      "match_phrase_prefix": {
                        "venueName": "mancheste"
                      }
                    }
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "partnersites": "16"
                      }
                    },
                    {
                      "match_phrase_prefix": {
                        "venueTown": "mancheste"
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  },
  "aggs": {
    "distinct_names": {
      "terms": {
        "field": "groupedName.keyword",
        "size": 30
      },
      "aggs": {
        "top_tag_hits": {
          "top_hits": {
            "size": 1,
            "_source": [
              "groupedName",
              "groupedDisplayName",
              "groupedUrl",
              "eventCode",
              "venueName",
              "venueTown",
              "venueId",
              "media"
            ]
          }
        }
      }
    }
  }
}

Upvotes: 1

Related Questions