美文网首页ElasticSearch实战笔记
21、ElasticSearch 7.x的query+bool查

21、ElasticSearch 7.x的query+bool查

作者: 众神开挂 | 来源:发表于2020-04-05 13:10 被阅读0次

    主要内容:

    1、手动控制全文检索结果的精准度

    1.1、为帖子数据增加标题字段
    POST /forum/_bulk
    { "update": { "_id": "1"} }
    { "doc" : {"title" : "this is java and elasticsearch blog"} }
    { "update": { "_id": "2"} }
    { "doc" : {"title" : "this is java blog"} }
    { "update": { "_id": "3"} }
    { "doc" : {"title" : "this is elasticsearch blog"} }
    { "update": { "_id": "4"} }
    { "doc" : {"title" : "this is java, elasticsearch, hadoop blog"} }
    { "update": { "_id": "5"} }
    { "doc" : {"title" : "this is spark blog"} }
    
    1.2、搜索标题中包含java<u>或</u>elasticsearch的blog

    这个,就跟之前的那个term query,不一样了。不是搜索exact value,是进行full text全文检索。
    match query,是负责进行全文检索的。当然,如果要检索的field,是keyword类型的,那么match query也相当于term query。

    GET /forum/_search
    {
      "query": {
        "match": {
          "title": "java elasticsearch"
        }
      }
    }
    
    1.3、搜索标题中包含java<u>和</u>elasticsearch的blog

    搜索结果精准控制的第一步:灵活使用and关键字,如果你是希望所有的搜索关键字都要匹配的,那么就用and,可以实现单纯match query无法实现的效果

    GET /forum/_search
    {
      "query": {
        "match": {
          "title": {
            "query": "java elasticsearch",
            "operator": "and"
          }
        }
      }
    }
    
    1.4、搜索包含java,elasticsearch,spark,hadoop,4个关键字中,至少3个的blog

    控制搜索结果的精准度的第二步:指定一些关键字中,必须至少匹配其中的多少个关键字,才能作为结果返回

    GET /forum/_search
    {
      "query": {
        "match": {
          "title": {
            "query": "java elasticsearch spark hadoop",
            "minimum_should_match": "75%"      ## 使用"minimum_should_match": "3" 也可以
          }
        }
      }
    }
    
    1.5、用bool组合多个搜索条件,来搜索title
    GET /forum/_search
    {
      "query": {
        "bool": {
          "must": {
            "match": {"title": "java"}
          },
          "must_not": {
            "match": {"title": "spark"}
          },
          "should": [
            {
              "match": {"title": "hadoop"}
            },
            {
              "match": {"title": "elasticsearch"}
            }
          ]
        }
      }
    }
    
    1.6、bool组合多个搜索条件,如何计算relevance score

    must和should搜索对应的分数,加起来,除以must和should的总数

    should是可以影响相关度分数的
    在满足must的基础之上,should中的条件,不匹配也可以,但是如果匹配的更多,那么document的relevance score就会更高

    1.7、搜索java,hadoop,spark,elasticsearch,至少包含其中3个关键字

    默认情况下,should是可以不匹配任何一个的,比如上面的搜索中,this is java blog,就不匹配任何一个should条件
    但是有个例外的情况,如果没有must的话,那么should中必须至少匹配一个才可以
    比如下面的搜索,should中有4个条件,默认情况下,只要满足其中一个条件,就可以匹配作为结果返回

    但是可以精准控制,should的4个条件中,至少匹配几个才能作为结果返回

    GET /forum/_search
    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "title": "java"
              }
            },
            {
              "match": {
                "title": "elasticsearch"
              }
            },
            {
              "match": {
                "title": "hadoop"
              }
            },
            {
              "match": {
                "title": "spark"
              }
            }
          ],
          "minimum_should_match": 3
        }
      }
    }
    

    梳理一下学到的知识点

    1、全文检索的时候,进行多个值的检索,有两种做法,match query;should
    2、控制搜索结果精准度:and operator,minimum_should_match

    2、基于term+bool实现的multiword搜索底层原理

    2.1、普通match如何转换为term+should
    {
        "match": { "title": "java elasticsearch"}
    }
    

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

    {
      "bool": {
        "should": [
          { "term": { "title": "java" }},
          { "term": { "title": "elasticsearch"   }}
        ]
      }
    }
    
    2.2、and match如何转换为term+must
    {
        "match": {
            "title": {
                "query":    "java elasticsearch",
                "operator": "and"
            }
        }
    }
    
    
    ##转化后
    {
      "bool": {
        "must": [
          { "term": { "title": "java" }},
          { "term": { "title": "elasticsearch"   }}
        ]
      }
    }
    
    2.3、minimum_should_match如何转换
    "match": {
        "title": {
            "query": "java elasticsearch hadoop spark",
            "minimum_should_match": "75%"
        }
    }
    
    ##转化后
    {
      "bool": {
        "should": [
          { "term": { "title": "java" }},
          { "term": { "title": "elasticsearch"   }},
          { "term": { "title": "hadoop" }},
          { "term": { "title": "spark" }}
        ],
        "minimum_should_match": 3 
      }
    }
    

    相关文章

      网友评论

        本文标题:21、ElasticSearch 7.x的query+bool查

        本文链接:https://www.haomeiwen.com/subject/aeokuhtx.html