elasticsearch version: 7.10.1
match_bool_prefix 是 Elasticsearch 中用于执行布尔前缀查询的一种查询类型。这种查询类型特别适用于当你想要匹配一个字段的前缀,并且希望这个字段中的词语是按照一定顺序出现的场景。
match_bool_prefix 语法
{ "query": { "match_bool_prefix": { "field_name": { "query": "your_query_string", "max_expansions": <number_of_expansions>, "lenient": <true_or_false> } } }
}
- field_name 是你想要执行查询的字段名。
- query 是你想要匹配的前缀字符串。
- max_expansions 是一个可选参数,用于限制查询可以扩展到的最大术语数。这有助于控制查询的复杂性和性能。如果不指定,则默认为 50。
- lenient 是一个可选参数,如果设置为 true,则格式错误的字段将被忽略。默认为 false。
match_bool_prefix例题
场景1
假设我们有一个电商应用,用户需要搜索产品名称,我们希望支持前缀查询并控制最大扩展数量
索引创建
PUT /products
{"mappings": {"properties": {"product_name": {"type": "text","analyzer": "standard"}}}
}
文档插入
POST /products/_doc
{"product_name": "Apple iPhone 12 Pro Max"
}POST /products/_doc
{"product_name": "Samsung Galaxy S21 Ultra"
}POST /products/_doc
{"product_name": "Google Pixel 5"
}POST /products/_doc
{"product_name": "OnePlus 9 Pro"
}
查询语句
GET /products/_search
{"query": {"match_bool_prefix": {"product_name": {"query": "iPhone","max_expansions": 3}}}
}
场景2(max_expansions 使用)
max_expansions 参数在Elasticsearch的模糊匹配查询中,如 match_phrase_prefix 或 match_bool_prefix 等查询类型中使用,用于限制前缀查询时生成的可能候选项的数量。下面是一个具体的示例
假设我们有一个索引 library_books,其中包含书籍标题字段 title,并且用户想要搜索所有以 “机器学习” 开头的书籍,但您希望限制可能的结果数量以避免过多的资源消耗。
索引创建
PUT /library_books
{"mappings": {"properties": {"title": {"type": "text","analyzer": "standard"}}}
}
文档插入
POST /library_books/_doc/
{"title": "机器学习实战"
}POST /library_books/_doc/
{"title": "机器学习原理与应用"
}POST /library_books/_doc/
{"title": "深度学习与机器学习"
}POST /library_books/_doc/
{"title": "Python机器学习指南"
}POST /library_books/_doc/
{"title": "机器智能"
}
查询语句
GET /library_books/_search
{"query": {"match_phrase_prefix": {"title": {"query": "机器学习","max_expansions": 2}}}
}
在这个例子中,尽管实际文档中有多本标题包含“机器学习”或以此为前缀的书籍,但由于设置了 max_expansions 为2,Elasticsearch只会查找最多包含两个额外词项的匹配项(例如:“机器学习实战” 和 “机器学习原理与应用”)。如果实际的文档库中有更多以 “机器学习” 前缀开始的不同书名,max_expansions 将会限制返回结果的数量至设定的最大扩展数以内