SpringBoot集成Elasticsearch7.x(5)|(term、match、match_phrase区别)

SpringBoot集成Elasticsearch7.x(5)|(term、match、match_phrase区别)


文章目录

  • SpringBoot集成Elasticsearch7.x(5)|(term、match、match_phrase区别)
    • @[TOC]
  • 前言
  • 使用场景介绍
  • 一、term精确查询
  • 二、match模糊匹配查询
  • 三、match_phase全匹配模糊查询
  • 四、wildcard模糊查询
  • 总结

章节
第一章链接: SpringBoot集成Elasticsearch7.x(1)|(增删改查功能实现)
第二章链接: SpringBoot集成Elasticsearch7.x(2)|(复杂查询)
第三章链接: SpringBoot集成Elasticsearch7.x(3)|(aggregations之指标聚合查询)
第四章链接: SpringBoot集成Elasticsearch7.x(4)|(aggregations之分桶聚合查询)
第五章链接: SpringBoot集成Elasticsearch7.x(5)|(term、match、match_phrase区别)
第六章链接: SpringBoot集成Elasticsearch8.x(6)|(新版本Java API Client使用)
第七章链接: SpringBoot集成Elasticsearch8.x(7)|(新版本Java API Client使用完整示例)

前言

本章节主要介绍SpringBoot项目集成ElasticSearch基于term、match、match_phrase查询语义上的一些区别以及使用场景。

使用场景介绍

term:主要用于精确的数据类型匹配,比如int、keyword、double等
match:主要用于模糊匹配,数据类型通常为text,并且具有分词功能
match_phrase:主要用于模糊完全匹配,数据类型通常为text,并且具有分词功能
wildcard:主要用于部分词的字段like查询,功能和ysql的like功能完全相同

一、term精确查询

用于精确的值进行查找,例如日期、价格、产品ID、数量。term级别查询不会对查询语句进行分词,而是精确的去匹配结构化数据中的字段值

注意:如果term用在text的数据类型,是将条件字段拿去和库中分词后结果比对,这样往往会查不到结果

1、查询价格是60的数据 (price 数字类型)
  GET /architecture_index/_search 
{
  "query": {
    "term": {
      "price": 60
    }
  }
}
2、查询地址数据(address是text类型进行了分词存储)
注意:这里如果参数传【颐和园路5号、颐和园...】是查不到结果的,只有传单个字,可以查出结果,原因是term查询会将条件和address分词后的结果去匹配,
GET /architecture_index/_search 
{
  "query": {
    "term": {
      "address": "颐"
    }
  },
  "from": 0,
  "size": 100
}

查询结果:
 "hits" : [
      {
        "_index" : "architecture_index",
        "_type" : "_doc",
        "_id" : "VUeyEoMBaUl84GaQZNRW",
        "_score" : 1.4618267,
        "_source" : {
          "address" : "颐和园路5号",
          "area" : "海定区",
          "city" : "北京",
          "description" : "中国文人集中地",
          "id" : "008",
          "location" : {
            "lat" : 33.7,
            "lon" : 34.6
          },
          "name" : "北京大学",
          "price" : 60.0,
          "province" : "北京",
          "score" : 4.6
        }
      }

二、match模糊匹配查询

模糊匹配,会对输入参数进行分词,比如"hello world"会进行拆分为hello和world,然后用分词去匹配,如果字段中包含hello或者world,或者都包含的结果都会被查询出来,也就是说match是一个部分匹配的模糊查询。查询条件相对来说比较宽松

注意:match是ES中的核心查询功能,用于参数分词去匹配库中分词的数据,会更具匹配度计算得分,匹配的越多、顺序越靠近,分数越高。前提条件字段需要text类型,并且进行了分词。

地址查询address 为text类型,进行了分词
GET /architecture_index/_search 
{
  "query": {
    "match": {
      "address": "南京西路"
    }
  },
  "from": 0,
  "size": 100
}

查询结果会查询出 【南京西路,长江西路,海定路...】等所有带address分词的数据。并且按照匹配度计算得分
结果距离如下:
 {
        "_index" : "architecture_index",
        "_type" : "_doc",
        "_id" : "VEeyEoMBaUl84GaQZNRI",
        "_score" : 0.8760128,
        "_source" : {
          "address" : "南京西路422号",
          "area" : "南京",
          "city" : "南京",
          "description" : "美丽的大学",
        }
      },
      {
        "_index" : "architecture_index",
        "_type" : "_doc",
        "_id" : "VUeyEoMBaUl84GaQZNRW",
        "_score" : 0.8760128,
        "_source" : {
          "address" : "颐和园路5号",
          "area" : "海定区",
          "city" : "北京",
          "description" : "中国文人集中地",
        }
      }

三、match_phase全匹配模糊查询

会对输入做分词,但是需要结果中也包含所有的分词,而且顺序要求一样。以"hello world"为例,要求结果中必须包含hello和world,而且还要求他们是连着的,顺序也是固定的,hello that word不满足,world hello也不满足条件

注意:如果term用在text的数据类型,是将条件字段拿去和库中分词后结果比对,这样往往会查不到结果

1、查询地址中含有“西路的数据”  address 为text字段进行了分词
  GET /architecture_index/_search 
  {
    "query": {
      "match_phrase": {
        "address": "西路"
      }
    },
    "from": 0,
    "size": 100
  }
只有address含有“西路”的才能被查询到
结果如下:
 {
        "_index" : "architecture_index",
        "_type" : "_doc",
        "_id" : "VEeyEoMBaUl84GaQZNRI",
        "_score" : 0.8760128,
        "_source" : {
          "address" : "南京西路422号",
          "area" : "南京",
          "city" : "南京",
          "description" : "美丽的大学",
        }
      },
      {
        "_index" : "architecture_index",
        "_type" : "_doc",
        "_id" : "VUeyEoMBaUl84GaQZNRW",
        "_score" : 0.8760128,
        "_source" : {
          "address" : "淮海西路6号",
          "area" : "海定区",
          "city" : "北京",
          "description" : "小吃地",
        }
      }

四、wildcard模糊查询

不做分词,类似于mysql中的like查询,需要用*占位

注意:主要用于部分词的字段模糊查询

1、查询区域中以“海定”开头的数据
  GET /architecture_index/_search 
  {
    "query": {
      "wildcard": {
        "area": "海定*"
      }
    },
    "from": 0,
    "size": 100
  }
可以查询are开头为“海定”的数据,【北京海定**】这样的查询不到
结果如下:
 {
        "_index" : "architecture_index",
        "_type" : "_doc",
        "_id" : "VEeyEoMBaUl84GaQZNRI",
        "_score" : 0.8760128,
        "_source" : {
          "address" : "南京西路422号",
          "area" : "海定区",
          "city" : "南京",
          "description" : "美丽的大学",
        }
      },
      {
        "_index" : "architecture_index",
        "_type" : "_doc",
        "_id" : "VUeyEoMBaUl84GaQZNRW",
        "_score" : 0.8760128,
        "_source" : {
          "address" : "淮海西路6号",
          "area" : "海定区",
          "city" : "北京",
          "description" : "小吃地",
        }
      }

总结

以上就是SpringBoot集成Elasticsearch数据库内容,在验证过程中遇到很多问题,输出的文档都是经过验证可执行的,后续会慢慢更新文章,尽量覆盖全面,如果大家在使用过程中遇到问题欢迎留言。

你可能感兴趣的:(springboot集成,elasticsearch,spring,boot,elasticsearch)