章节
第一章链接: 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功能完全相同
用于精确的值进行查找,例如日期、价格、产品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
}
}
模糊匹配,会对输入参数进行分词,比如"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" : "中国文人集中地",
}
}
会对输入做分词,但是需要结果中也包含所有的分词,而且顺序要求一样。以"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" : "小吃地",
}
}
不做分词,类似于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数据库内容,在验证过程中遇到很多问题,输出的文档都是经过验证可执行的,后续会慢慢更新文章,尽量覆盖全面,如果大家在使用过程中遇到问题欢迎留言。