ElasticSearch 将条件语句'and'与'or'相结合



下面查询的目的是为每个条件返回n个结果,即它必须匹配partnersites 16并匹配'venueTown'或partnersites 16并匹配'venueName'。目前,它返回的结果中每个字段必须包含相同的字符串。在我的例子中,字段:name, venueName和venueTown必须包含曼彻斯特,但我希望每对{(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"]
                    }
                }
            }
        }
    }
}

试试这个:

{
  "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"
            ]
          }
        }
      }
    }
  }
}

最新更新