如何用Elastic Search单查询获取包含指定两部电影的视频服务?
解决方案:查询同时包含指定两部电影的视频服务
嘿,这个需求用Elasticsearch的nested查询结合布尔查询就能完美实现,确保只有同时匹配两部指定电影(每部的title和genre都完全匹配)的video_service才会被返回。
核心思路
因为movies是nested类型,普通查询无法跨嵌套文档匹配条件,所以我们需要用两个独立的nested查询分别匹配一部目标电影,再通过外层bool查询的must子句要求两个条件同时满足——这样就能保证同一个video_service里同时存在这两部符合要求的电影。
具体查询DSL示例
假设你要找同时包含**《盗梦空间》(科幻类)和《蝙蝠侠:黑暗骑士》(动作类)**的视频服务,对应的查询语句如下:
GET /video_service_inventory/_search { "query": { "bool": { "must": [ // 匹配第一部电影:title和genre完全匹配 { "nested": { "path": "movies", "query": { "bool": { "must": [ { "term": { "movies.title": "盗梦空间" } }, { "term": { "movies.genre": "科幻" } } ] } } } }, // 匹配第二部电影:title和genre完全匹配 { "nested": { "path": "movies", "query": { "bool": { "must": [ { "term": { "movies.title": "蝙蝠侠:黑暗骑士" } }, { "term": { "movies.genre": "动作" } } ] } } } } ] } } }
关键细节说明
term查询的使用:如果你的movies.title和movies.genre是keyword类型(适合精确匹配的场景),用term查询能确保完全匹配文本内容,不会有分词带来的模糊匹配问题。- 如果字段是
text类型:如果你的字段是text类型需要精确匹配,可以用match查询并设置operator: "and",比如:{ "match": { "movies.title": { "query": "盗梦空间", "operator": "and" } } } - 外层
bool.must的作用:两个nested查询被放在must数组里,意味着只有同时满足两个嵌套查询条件的文档才会被返回,只包含其中一部电影的video_service会被自动过滤掉。
这样单个查询就能完全满足你的需求啦!
内容的提问来源于stack exchange,提问作者coding4tw
相关产品推荐
相关产品推荐

