• 微服务框架 SpringCloud微服务架构 22 DSL 查询语法 22.2 全文检索查询


    微服务框架

    【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】

    SpringCloud微服务架构

    22 DSL 查询语法

    22.2 全文检索查询
    22.2.1 全文检索查询

    全文检索查询,会对用户输入内容分词,常用于搜索框搜索:

    在这里插入图片描述

    在这里插入图片描述

    【分类】

    match查询:全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索,语法:

    GET /indexName/_search
    {
      "query": {
        "match": {
          "FIELD": "TEXT"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    试试

    【老师这儿,用到了all,但是,笔者创建的时候已经把它删了…】

    那能咋办,重新建一个索引库吧

    package cn.itcast.hotel.constants;
    
    /**
     * ClassName: HotelConstants
     * date: 2022/11/1 10:16
     *
     * @author DingJiaxiong
     */
    
    
    public class HotelConstants {
    
        public static final String MAPPING_TEMPLATE = "{\n" +
                "  \"mappings\": {\n" +
                "    \"properties\": {\n" +
                "      \"id\":{\n" +
                "        \"type\": \"keyword\"\n" +
                "      },\n" +
                "      \"name\":{\n" +
                "        \"type\": \"text\",\n" +
                "        \"analyzer\": \"ik_max_word\",\n" +
                "        \"copy_to\": \"all\"\n" +
                "      },\n" +
                "      \"address\":{\n" +
                "        \"type\": \"keyword\",\n" +
                "        \"index\": false\n" +
                "      },\n" +
                "      \"price\":{\n" +
                "        \"type\": \"integer\"\n" +
                "      },\n" +
                "      \"score\":{\n" +
                "        \"type\": \"integer\"\n" +
                "      },\n" +
                "      \"brand\":{\n" +
                "        \"type\":\"keyword\",\n" +
                "        \"copy_to\": \"all\"\n" +
                "      },\n" +
                "      \"city\":{\n" +
                "        \"type\": \"keyword\"\n" +
                "      },\n" +
                "      \"starName\":{\n" +
                "        \"type\": \"keyword\"\n" +
                "      },\n" +
                "      \"business\":{\n" +
                "        \"type\": \"keyword\",\n" +
                "        \"copy_to\": \"all\"\n" +
                "      },\n" +
                "      \"location\":{\n" +
                "        \"type\": \"geo_point\"\n" +
                "      },\n" +
                "      \"pic\":{\n" +
                "        \"type\": \"keyword\",\n" +
                "        \"index\": false\n" +
                "      },\n" +
                "      \"all\":{\n" +
                "        \"type\": \"text\",\n" +
                "        \"analyzer\": \"ik_max_word\"\n" +
                "      }\n" +
                "    }\n" +
                "  }\n" +
                "}";
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    先把已有的索引库删掉

    在这里插入图片描述

    重新创建索引库

    在这里插入图片描述

    OK,再次执行批量插入操作

    在这里插入图片描述

    OK,这次就有all

    在这里插入图片描述

    # match 查询
    GET /hotel/_search
    {
      "query": {
        "match": {
          "all": "外滩"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    直接运行

    在这里插入图片描述

    {
      "took" : 0,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 3,
          "relation" : "eq"
        },
        "max_score" : 6.0247297,
        "hits" : [
          {
            "_index" : "hotel",
            "_type" : "_doc",
            "_id" : "60487",
            "_score" : 6.0247297,
            "_source" : {
              "address" : "黄浦路199号",
              "brand" : "君悦",
              "business" : "外滩地区",
              "city" : "上海",
              "id" : 60487,
              "location" : "31.245409, 121.492969",
              "name" : "上海外滩茂悦大酒店",
              "pic" : "https://m.tuniucdn.com/fb3/s1/2n9c/2Swp2h1fdj9zCUKsk63BQvVgKLTo_w200_h200_c1_t0.jpg",
              "price" : 689,
              "score" : 44,
              "starName" : "五星级"
            }
          },
          {
            "_index" : "hotel",
            "_type" : "_doc",
            "_id" : "432335",
            "_score" : 4.85054,
            "_source" : {
              "address" : "唐山路145号",
              "brand" : "7天酒店",
              "business" : "北外滩地区",
              "city" : "上海",
              "id" : 432335,
              "location" : "31.252585, 121.498753",
              "name" : "7天连锁酒店(上海北外滩国际客运中心地铁站店)",
              "pic" : "https://m2.tuniucdn.com/filebroker/cdn/res/c1/ba/c1baf64418437c56617f89840c6411ef_w200_h200_c1_t0.jpg",
              "price" : 249,
              "score" : 35,
              "starName" : "二钻"
            }
          },
          {
            "_index" : "hotel",
            "_type" : "_doc",
            "_id" : "434082",
            "_score" : 3.8000445,
            "_source" : {
              "address" : "复兴东路260号",
              "brand" : "如家",
              "business" : "豫园地区",
              "city" : "上海",
              "id" : 434082,
              "location" : "31.220706, 121.498769",
              "name" : "如家酒店·neo(上海外滩城隍庙小南门地铁站店)",
              "pic" : "https://m.tuniucdn.com/fb2/t1/G6/M00/52/B6/Cii-U13eXLGIdHFzAAIG-5cEwDEAAGRfQNNIV0AAgcT627_w200_h200_c1_t0.jpg",
              "price" : 392,
              "score" : 44,
              "starName" : "二钻"
            }
          }
        ]
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    OK, 一共命中了三条

    加上点儿

    在这里插入图片描述

    这样就变多 了,因为分词也变多了【而且可以看到两个词,如果都满足,得分就较高,就会排在前面】

    在这里插入图片描述

    multi_match:与match查询类似,只不过允许同时查询多个字段,语法:

    GET /indexName/_search
    {
      "query": {
        "multi_match": {
          "query": "TEXT",
          "fields": ["FIELD1", " FIELD12"]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    试试

    # multi_match 查询
    GET /hotel/_search
    {
      "query": {
        "multi_match": {
          "query": "外滩如家",
          "fields": ["brand","name","business"]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    直接运行

    在这里插入图片描述

    可以看到,居然和上面查询的一样

    【为什么?】

    原因很简单,因为我们的结构中,all 就是这三个合起来的

    在这里插入图片描述

    如果不一样,反而出错了

    但是还是建议用all 的方式,就是不要用多个字段,会降低性能,都copy_to 到all 中,成为一个字段,那样可以加快速度

    22.2.2 总结

    match和multi_match的区别是什么?

    • match:根据一个字段查询
    • multi_match:根据多个字段查询,参与查询字段越多,查询性能越差
  • 相关阅读:
    PMP项目管理考试的知识点概述
    11、将数组中的 0 移动到末尾
    解决:Android Studio 中sdk tools 中库显示不全的问题
    高忆管理:六连板捷荣技术或难扛“华为概念股”大旗
    阿里云对象存储OSS SDK的使用
    SQL 入门之第一讲——MySQL 8.0.29安装教程(windows 64位)
    Python if-for-while使用
    小白学java--垃圾回收机制(Garbage Collection)
    Tomcat 学习笔记
    2025快手校招面试真题汇总及其解答(二)
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/128214431