场景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 将会限制返回结果的数量至设定的最大扩展数以内