Elasticsearch match_bool_prefix的使用-match_bool_prefix例题

时间:2024-03-14 22:34:22

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