Elasticsearch布尔查询问题:如何构造匹配指定书名及作者的书籍查询
查询评估与优化方案
原查询存在的问题
- 冗余嵌套层级:外层
bool.should以及作者查询部分的bool.should完全多余,单个条件的should和must效果一致,徒增查询复杂度。 - 字段类型不匹配:
name是text类型,默认会被分词(比如"book a"会被拆分为"book"和"a"两个词条),用term查询精确值"book a"无法匹配目标文档,因为term是针对分词后的单个词条做精确匹配。 - 逻辑结构冗余:整个查询的多层嵌套
bool结构完全可以简化,没有必要。
正确的查询方案
结合你的映射配置和需求,提供两种可行的查询方式:
方式一:针对text字段使用match查询(适配分词场景)
match查询会自动使用字段对应的分词器处理查询内容,能正确匹配text类型的"book a":
{ "query": { "bool": { "must": [ { "match": { "name": "book a" } }, { "match": { "authors.name": "John" } } ] } } }
方式二:用keyword子字段做精确匹配(若自动生成了子字段)
默认情况下,Elasticsearch会为text类型字段自动生成字段名.keyword格式的子字段,存储未分词的原始值,适合精确匹配场景:
{ "query": { "bool": { "must": [ { "term": { "name.keyword": { "value": "book a" } } }, { "term": { "authors.name.keyword": { "value": "John" } } } ] } } }
补充说明
如果后续需要针对单个作者的多个属性做联合查询(比如同时匹配作者名和年龄),才需要将authors设置为nested类型并使用nested查询,当前仅匹配作者名的需求,现有动态映射的扁平存储方式完全可以满足。
内容的提问来源于stack exchange,提问作者Shawn Yeung
相关产品推荐
相关产品推荐

