白话Elasticsearch07- 深度探秘搜索技术之基于term+bool实现的multiword搜索底层剖析

2021-08-17 16:52:14 浏览数 (1)

文章目录

  • 概述
  • 普通match转换为term should
  • and match转换为term must
  • minimum_should_match如何转换

概述

继续跟中华石杉老师学习ES,第七篇

课程地址: https://www.roncoo.com/view/55


普通match转换为term should

上一篇博文中我们 使用了 搜索标题中包含java或elasticsearch的blog 这个例子

代码语言:javascript复制
GET /forum/article/_search
{
  "query": {
    "match": {
      "title": "java elasticsearch"
    }
  }
}

我们通过分词器查看,可以知道 es是把 java和elasticsearch放到了倒排索引中,

那es是如何查询的呢? 我们通过 profile

代码语言:javascript复制
GET /forum/article/_search
{
  "profile": "true", 
  "query": {
    "match": {
      "title": "java elasticsearch"
    }
  }
}

或者kibana提供的

使用诸如上面的match query进行多值搜索的时候,es会在底层自动将这个match query转换为bool的语法 . bool should,指定多个搜索词,同时使用term query

等同于

代码语言:javascript复制
GET /forum/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "title": "java"
          }
        },
        {
          "term": {
            "title": "elasticsearch"
          }
        }
      ]
    }
  }
}

and match转换为term must

搜索标题中包含java和elasticsearch的blog 中的

代码语言:javascript复制
GET /forum/_search
{
  "query": {
    "match": {
      "title": {
        "query": "java elasticsearch",
        "operator": "and"
      }
    }
  }
}

and match转换为term must

等同于

代码语言:javascript复制
GET /forum/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "title": "java"
          }
        },
        {
          "term": {
            "title": "elasticsearch"
          }
        }
      ]
    }
  }
}

minimum_should_match如何转换

搜索包含java,elasticsearch,spark,hadoop,4个关键字中,至少3个的blog

代码语言:javascript复制
GET /forum/_search
{
  "query": {
    "match": {
      "title": {
        "query": "java elasticsearch hadoop spark",
        "minimum_should_match": 3
      }
    }
  }
}

等同于

代码语言:javascript复制
GET /forum/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "title": "java"
          }
        },
        {
          "term": {
            "title": "elasticsearch"
          }
        },
        {
          "term": {
            "title": "hadoop"
          }
        },
        {
          "term": {
            "title": "spark"
          }
        }
      ],
      "minimum_should_match": 3
    }
  }
}

0 人点赞