Elasticsearch(十四)搜索---搜索匹配功能⑤--全文搜索

news2024/12/23 3:55:56

一、前言

不同于之前的term。terms等结构化查询,全文搜索首先对查询词进行分析,然后根据查询词的分词结果构建查询。这里所说的全文指的是文本类型数据(text类型),默认的数据形式是人类的自然语言,如对话内容、图书名称、商品介绍和酒店名称等。结构化搜索关注的是数据是否匹配,全文搜索关注的是匹配程度;结构化搜索一般用于精确匹配,而全文搜索用于部分匹配。本章将详细介绍使用最多的全文搜索。

二、match查询

match查询是全文搜索的主要代表。对于最基本的match搜索来说,只要分词中的一个或者多个在文档中存在即可。例如搜索“京盛酒店”,查询词先被分词器切分为“京”“盛”“酒”“店”,因此,只要文档中包含这4个字中的任何一个字,都会被搜索到。
您可能会有疑问,为什么“京盛酒店被切分为4个字而不是“京盛”“酒店”两个词呢?这是因为在默认情况下,match查询使用的是标准分词器。该分词器比较适用于英文,如果是中文则按照字进行切分,因此默认的分词器不适合做中文搜索,在后面的章节中将介绍如何安装和使用中文分词器。
以下DSL示例为按照标题搜索“京盛酒店”:

POST /hotel/_search
{
  "query": {
    "match": {   //匹配title字段为"金都酒店"的文档
      "title":  "京盛酒店"
    }
  }
}

或者按照如下形式搜索:

POST /hotel/_search
{
  "query": {
    "match": {
      "title": {
        "query": "京盛酒店"
      }
    }
  }
}

搜索结果如下:

{
  ...
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.3428942,
    "hits" : [
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "002",
        "_score" : 1.3428942,
        "_source" : {
          "title" : "京盛酒店",
          "city" : "北京",
          "price" : "337.00",
          "create_time" : "2020-07-29 13:00:00",
          "amenities" : "充电停车场/可升降停车场",
          "full_room" : false,
          "location" : {
            "lat" : 39.911543,
            "lon" : 116.403
          },
          "praise" : 60
        }
      },
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "30",
        "_score" : 1.2387041,
        "_source" : {
          "title" : "京盛酒小店",
          "city" : "上海",
          "price" : "300.00",
          "create_time" : "2022-01-29 22:52:00",
          "amenities" : "露天游泳池,普通/充电停车场",
          "full_room" : false,
          "praise" : 2000
        }
      },
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "27",
        "_score" : 0.5495611,
        "_source" : {
          "title" : "盛况精选酒店",
          "city" : "南昌",
          "price" : "900.00",
          "create_time" : "2022-07-29 22:50:00",
          "amenities" : "露天游泳池,普通/充电停车场",
          "full_room" : false,
          "location" : {
            "lat" : 56.918229,
            "lon" : 126.422011
          },
          "praise" : 200
        }
      }
    ]
  }
}

从结果中可以看到,匹配度最高的文档是002,该酒店的名称和查询词相同,得分为1.3428942;次之的文档是30,因为该酒店名称中包含“京”“盛”“酒”“店”。但是想比前一个文档多了一个“小”字,所以部分匹配。再次之的文档是27,它只有“盛”“酒”“店”三个字和查询词部分匹配,因此排在最后。
假设用户搜索名称中同时包含“京”和“盛”的酒店,显然之前最后一个文档27就不是用户想要命中的文档。那么在ES中,match搜索可以设置operator参数,该参数决定文档按照分词后的词集合进行“与”还是“或”匹配。在默认情况下,该参数的值为“或”关系,即operator的值为or,这也解释了搜索结果中包含部分匹配的文档。如果希望各个词之间的匹配结果是“与”关系,则可以设置operator参数的值为and。
下面的请求示例设置查询词之间的匹配结果为“与”关系:

POST /hotel/_search
{
  "query": {
    "match": {
      "title": {
        "query": "京盛酒店",
        "operator": "and"
      }
    }
  }
}

搜索结果如下:

{
  ...
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.3428942,
    "hits" : [
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "002",
        "_score" : 1.3428942,
        "_source" : {
          "title" : "京盛酒店",
          "city" : "北京",
          "price" : "337.00",
          "create_time" : "2020-07-29 13:00:00",
          "amenities" : "充电停车场/可升降停车场",
          "full_room" : false,
          "location" : {
            "lat" : 39.911543,
            "lon" : 116.403
          },
          "praise" : 60
        }
      },
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "30",
        "_score" : 1.2387041,
        "_source" : {
          "title" : "京盛酒小店",
          "city" : "上海",
          "price" : "300.00",
          "create_time" : "2022-01-29 22:52:00",
          "amenities" : "露天游泳池,普通/充电停车场",
          "full_room" : false,
          "praise" : 2000
        }
      }
    ]
  }
}

有时搜索多个关键字,关键词和文档在某一个比例上匹配即可,如果使用“与”操作过于严苛,如果使用“或”操作又过于宽松。这时可以采用minimum_should_match参数,该参数叫作最小匹配参数,其值为一个数值,意义为可以匹配上的词的个数.在一般情况下将其设置为一个百分数,因为在真实场景中并不能精确控制具体的匹配数量。以下示例设置最小匹配为80%的文档:

POST /hotel/_search
{
  "query": {
    "match": {
      "title": {
        "query": "京盛酒店",
        "operator": "or",
        "minimum_should_match": "80%"    //设置最小匹配度为80%
      }
    }
  }
}

这样的话就需要满足最后命中的文档字数占查询条件中“京盛酒店”的80%(向下取整),例如这里4*80%,其实查询结果只需要有条件中任意三个字符即可。
在Java客户端上可以使用QueryBuilders.matchQuery()方法构建match请求,分别给该方法传入字段名称和查询值即可进行match查询。以下代码展示了match请求的使用逻辑:
service层

	public List<Hotel> matchQuery(HotelDocRequest hotelDocRequest) throws IOException {
		//新建搜索请求
		String indexName = getNotNullIndexName(hotelDocRequest);
		SearchRequest searchRequest = new SearchRequest(indexName);
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		//查询title且查询值之间关系是or,并且最小匹配参数为80%
		MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("title", hotelDocRequest.getTitle()).operator(Operator.OR).minimumShouldMatch("80%");
		searchSourceBuilder.query(matchQueryBuilder);
		searchRequest.source(searchSourceBuilder);
		return getQueryResult(searchRequest);
	}

controller层

	@PostMapping("/query/match")
	public FoundationResponse<List<Hotel>> matchQuery(@RequestBody HotelDocRequest hotelDocRequest) {
		try {
			List<Hotel> hotelList = esQueryService.matchQuery(hotelDocRequest);
			if (CollUtil.isNotEmpty(hotelList)) {
				return FoundationResponse.success(hotelList);
			} else {
				return FoundationResponse.error(100,"no data");
			}
		} catch (IOException e) {
			log.warn("搜索发生异常,原因为:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		} catch (Exception e) {
			log.error("服务发生异常,原因为:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		}
	}

postman调用截图
在这里插入图片描述

三、multi_match查询

有时用户需要在多个字段中查询关键词,除了使用布尔查询封装多个match查询之外,可替代的方案是使用multi_match。可以在multi_match的query子句中组织数据匹配规则,并在fields子句中指定需要搜索的字段列表。
下面的示例在title和amenities两个字段中同时搜索“假日”关键词:

POST /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "假日",
      "fields": [
        "amenities",
        "title"
        ]
    }
  }
}

搜索结果如下:

{
  "took" : 14,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : 4.2939954,
    "hits" : [
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "28",
        "_score" : 4.2939954,
        "_source" : {
          "title" : "京盛假日酒店",
          "city" : "上海",
          "price" : "600.00",
          "create_time" : "2021-04-29 22:52:00",
          "amenities" : "露天游泳池,普通/充电停车场",
          "full_room" : false,
          "praise" : 200
        }
      },
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "003",
        "_score" : 1.9696801,
        "_source" : {
          "title" : "文雅文化酒店",
          "city" : "天津",
          "price" : "260.00",
          "create_time" : "2021-02-27 22:00:00",
          "amenities" : "提供假日party,免费早餐,浴池,充电停车场",
          "full_room" : true,
          "location" : {
            "lat" : 39.186555,
            "lon" : 117.162767
          },
          "praise" : 30
        }
      },
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "29",
        "_score" : 1.9163029,
        "_source" : {
          "title" : "京盛欣欣酒店",
          "city" : "上海",
          "price" : "700.00",
          "create_time" : "2022-01-29 22:52:00",
          "amenities" : "提供假日party,露天游泳池,普通/充电停车场",
          "full_room" : false,
          "praise" : 200
        }
      },
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "004",
        "_score" : 1.6876338,
        "_source" : {
          "title" : "京盛集团酒店",
          "city" : "上海",
          "price" : "800.00",
          "create_time" : "2021-05-29 21:35:00",
          "amenities" : "浴池(假日需预订),室内游泳池,普通停车场/充电停车场",
          "full_room" : true,
          "location" : {
            "lat" : 36.940243,
            "lon" : 120.394
          },
          "praise" : 100
        }
      }
    ]
  }
}

根据结果可以看到,命中的文档要么在title中包含“假日”关键词,要么在amenities字段中包含“假日”关键词。
且之前在Match搜索讲到的operator,minimum_should_match等参数在multi_match搜索中同样适用
在Java客户端上可以使用QueryBuilders.multiMatchQuery()方法或者直接new MultiMatchQueryBuilder()构建multi_match请求
可以看到,我们构造MultiMatchQueryBuilder,除了查询值,字段它接收的是一个可变长String数组
在这里插入图片描述
所以我们可以在传参hotelDocRequest加两个参数,一个是multiQueryValue代表要查询的值,另一个是multiQueryPropertyNames代表想要在哪些字段查询
分别给该方法传入查询值和多个字段名称即可进行multi_match查询。以下代码展示了multi_match请求的使用逻辑:
Service层
由于上面讲到构造MultiMatchQueryBuilder接收的是可变长String数组,所以我们要对传参的List通过list.stream().toArray(String[]::new);转化为String可变长数组(String…等价于String[])。

	public List<Hotel> multiMatchQuery(HotelDocRequest hotelDocRequest) throws IOException {
		//新建搜索请求
		String indexName = getNotNullIndexName(hotelDocRequest);
		SearchRequest searchRequest = new SearchRequest(indexName);
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		MultiMatchQueryBuilder multiMatchQueryBuilder = new MultiMatchQueryBuilder(hotelDocRequest.getMultiQueryValue(), hotelDocRequest.getMultiQueryPropertyNames().toArray(new String[0]));
		searchSourceBuilder.query(multiMatchQueryBuilder);
		searchRequest.source(searchSourceBuilder);
		return getQueryResult(searchRequest);
	}

controller层

	@PostMapping("/query/multiMatch")
	public FoundationResponse<List<Hotel>> multiMatchQuery(@RequestBody HotelDocRequest hotelDocRequest) {
		try {
			List<Hotel> hotelList = esQueryService.multiMatchQuery(hotelDocRequest);
			if (CollUtil.isNotEmpty(hotelList)) {
				return FoundationResponse.success(hotelList);
			} else {
				return FoundationResponse.error(100,"no data");
			}
		} catch (IOException e) {
			log.warn("搜索发生异常,原因为:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		} catch (Exception e) {
			log.error("服务发生异常,原因为:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		}
	}

postman运行截图
在这里插入图片描述

四、match_phrase查询

match_phrase用于匹配短语,与match查询不同的是,match_phrase用于搜索确切的短语或临近的词语。假设在酒店标题中搜索“京盛酒店”,希望酒店标题中的“京盛酒店”四字完全按照搜索词的顺序并且紧邻,此时就需要使用match_phrase查询:

POST /hotel/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "京盛酒店"
      }
    }
  }
}

结果如下:

{
  ...
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.3428942,
    "hits" : [
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "002",
        "_score" : 1.3428942,
        "_source" : {
          "title" : "京盛酒店",
          "city" : "北京",
          "price" : "337.00",
          "create_time" : "2020-07-29 13:00:00",
          "amenities" : "充电停车场/可升降停车场",
          "full_room" : false,
          "location" : {
            "lat" : 39.911543,
            "lon" : 116.403
          },
          "praise" : 60
        }
      }
    ]
  }
}

根据上述结果可知,使用match_phrase查询后,只有文档002命中,而类似之前的“京盛集团酒店”等类似文档没有被命中,这是为什么呢?
我们知道,在默认标准分词器的情况下,文档002的title字段被切分为“京”“盛”“酒”“店”,其中这些分词后的文档下标“京”代表0,盛”代表1,“酒”代表2,“店”代表3,而对于match_phrase查询,在不去设置下标移动步长的情况下这些分词文档想要移动到理想位置(查询词的位置,这里就是京盛酒店)的步数默认就是0,而可以发现,我们命中的文档002“京盛酒店”,这个文档下标其实就已经是理想位置了,不需要额外移动,相当于步长就是0,所以能够命中。而对于“京盛集团酒店”,分词后“盛”想要移动到“酒”这个下标,需要移动2次,所以步长是2,不符合默认的步长,所以无法命中。
那么如果需要“京盛集团酒店”也能够被命中,则可以设置match_phrase查询的slop参数,它用来调节匹配词之间的距离阈值,即上面说的步长,下面的DSL将slop设置为2

POST /hotel/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "京盛酒店",
        "slop":2
      }
    }
  }
}

可以看到这样就能命中“京盛集团酒店”了
在这里插入图片描述
在Java客户端上可以使用QueryBuilders.matchPhraseQuery()方法构建match_phrase请求,分别给该方法传入查询字段和值即可运行multi_match查询。这一点和match搜索很像。以下代码展示了match_phrase请求的使用逻辑:
Service层

	public List<Hotel> matchPhraseQuery(HotelDocRequest hotelDocRequest) throws IOException {
		//新建搜索请求
		String indexName = getNotNullIndexName(hotelDocRequest);
		SearchRequest searchRequest = new SearchRequest(indexName);
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		//构造MatchPhraseQueryBuilder且设置步长为2
		MatchPhraseQueryBuilder matchPhraseQueryBuilder = new MatchPhraseQueryBuilder("title", hotelDocRequest.getTitle()).slop(2);
		searchSourceBuilder.query(matchPhraseQueryBuilder);
		searchRequest.source(searchSourceBuilder);
		return getQueryResult(searchRequest);
	}

Controller层

	@PostMapping("/query/matchPhrase")
	public FoundationResponse<List<Hotel>> matchPhraseQuery(@RequestBody HotelDocRequest hotelDocRequest) {
		try {
			List<Hotel> hotelList = esQueryService.matchPhraseQuery(hotelDocRequest);
			if (CollUtil.isNotEmpty(hotelList)) {
				return FoundationResponse.success(hotelList);
			} else {
				return FoundationResponse.error(100,"no data");
			}
		} catch (IOException e) {
			log.warn("搜索发生异常,原因为:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		} catch (Exception e) {
			log.error("服务发生异常,原因为:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		}
	}

Postman运行截图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/918999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地生活服务平台加盟哪家公司好?

本地生活的竞争从年初的火热到现在&#xff0c;已经进入了下半场&#xff0c;随着优胜劣汰的筛选&#xff0c;那么直到现在&#xff0c;想做本地生活服务平台加盟&#xff0c;哪家公司比较好呢&#xff0c;应该如何选择呢&#xff1f; 首先我们得弄懂&#xff0c;我们加盟本地…

c#设计模式-结构型模式 之 外观模式

概述 外观模式&#xff08;Facade Pattern&#xff09;又名门面模式&#xff0c;隐藏系统的复杂性&#xff0c;并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式&#xff0c;它向现有的系统添加一个接口&#xff0c;来隐藏系统的复杂性。该模式…

命令行一键启动和关闭java应用

背景 近来在搞springcloud微服务&#xff0c;有服务的注册和发现&#xff0c;即nacos。有网关服务&#xff0c;即spring-gateway。有认证中心服务。还有用户中心服务&#xff0c;文件中心服务&#xff0c;springboot admin等等。部署的时候&#xff0c;这么多服务&#xff0c;…

2023-8-23 KMP字符串

题目链接&#xff1a;KMP字符串 #include <iostream>using namespace std;const int N 100010, M 1000010;int n, m; char p[N], s[M]; int ne[N];int main() {cin >> n >> p 1 >> m >> s 1;// 求ne&#xff0c;也就是求next数组的过程for…

司徒理财:8.23晚间黄金多空走势分析及操作策略

黄金走势分析&#xff1a;      黄金下跌遇阻&#xff0c;短线开启震荡调整走势&#xff0c;但跌势依旧没有改变&#xff0c;没有突破1906压力前&#xff0c;还是偏空走势&#xff0c;反弹继续干空。趋势行情&#xff0c;不要轻言翻转&#xff01;即便下跌结束&#xff0c;…

从零开始搭建公司后台技术栈

整个后台技术栈我的理解包括 4 个层面的内容&#xff1a; 语言&#xff1a;用了哪些开发语言&#xff0c;如&#xff1a;C/Java/Go/PHP/Python/Ruby 等等&#xff1b;组件&#xff1a;用了哪些组件&#xff0c;如&#xff1a;MQ 组件&#xff0c;数据库组件等等&#xff1b;流…

网络安全(黑客)自学,看这篇就够了!

前言 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、…

Spring缓存深入解析:@Cacheable的使用详解

摘要&#xff1a;在本文中&#xff0c;我们将深入研究Spring框架中的Cacheable注解。我们会通过详细的Java示例&#xff0c;探讨如何使用这个功能强大的注解来提升应用程序性能。 一、什么是缓存&#xff1f; 在计算机科学中&#xff0c;缓存是一种存储技术&#xff0c;用于保…

入门超值型32位单片机MM32G0001开发板

灵动微入门级超值型MM32G0001系列MCU。采用48MHz ArmCortex-M0内核&#xff0c;提供16KB Flash和2KB SRAM&#xff0c;并提供丰富的外设资源。适用于多种多样的入门级32位MCU市场&#xff0c;可覆盖广泛的8/16位MCU升级需求。MM32G0001在各种温度范围内的闪存擦写寿命与数据保存…

OzCode v4.0 for VS2022 Crack

在 Datadog&#xff0c;我们认为了解生产环境对于构建更好的软件至关重要&#xff0c;尤其是在现代环境变得越来越复杂的情况下。生产中出现的错误通常很难在本地重现&#xff0c;OzCode 这使得开发人员只能猜测出了什么问题。为了解决这个问题&#xff0c;团队需要像本地环境一…

kaggle推荐系统比赛top方案汇总【附baseline代码】

推荐系统可以很好地解决信息过载以及信息不足等问题&#xff0c;广泛应用与电商、金融、新闻咨询、社交、旅游等行业&#xff0c;其中最典型并具有良好的发展和应用前景的领域就是电子商务领域。 在学术界&#xff0c;推荐系统同样是热门的研究方向&#xff0c;在各大顶会中的…

skynet环境搭建

一、系统环境&#xff1a;win10 二、基础软件下载&#xff1a; 1、VirtualBox虚拟机软件 下载地址&#xff1a;Oracle VM VirtualBox 其实常用的虚拟机软件是VMWare&#xff0c;VirtualBox&#xff0c;它轻量、开源免费&#xff0c;学习使用够用。 2、Ubuntu系统镜像 下载…

堆叠聚合模型是处理非平衡数据的理想算法

堆叠聚合模型是处理非平衡数据的理想算法 堆叠聚合模型的设计是通过训练多个模型&#xff0c;然后使用原模型&#xff0c;将多个模型的输出结果整合在一起以实现更准确的预测。这叠聚合模型在多个临床场景上都表现出优于单一模型的效能[1]。是构建临床预测模型过程中值得考察的…

听GPT 讲Alertmanager源代码--api

在Alertmanager项目中&#xff0c;api目录承担了与Alertmanager的API相关的功能和实现。下面是api目录中一些主要文件和作用的详细解释&#xff1a; api.go: 这个文件定义了Alertmanager的API接口&#xff0c;包括路由和处理API请求的函数。它定义了与Alertmanager交互的各种AP…

生信豆芽菜-样本分布比较的圈图

网址&#xff1a;http://www.sxdyc.com/visualsPieComparePlot 1、数据准备 样本的分组信息&#xff0c;其中第一列为需要比较组&#xff0c;其他都是默认和第一个进行比较 2、输入图片的宽度和高度&#xff0c;选择颜色的类型&#xff0c;提交后&#xff0c;等待运行成功即可…

C#开发WinForm之DataGridView开发

前言 DataGridView是开发Winform的一个列表展示&#xff0c;类似于表格。学会下面的基本特征用法&#xff0c;再辅以经验&#xff0c;基本功能开发没问题。 1.设置 DataGridView表格行首为序号索引, //设置 DataGridView表格行首为序号索引private void dataGridView1_RowPost…

WinDbg定位死锁问题

文章目录 方法1方法2方法3 方法1 1、首先确认下是哪个进程出现死锁的情况&#xff0c;如界面卡死、点击没有反应等&#xff0c;抓取对应进程的dump 2、查看是否存在 0:000> kv ChildEBP RetAddr Args to Child 0019f3b8 77736b0c 77722253 00000108 0000000…

JavaWeb-学习目录

技术栈介绍 文章目录 1.数据库&#xff1a;1.1 Mysql1.2 JDBC1.3 Maven1.4 Mybatis 2.前端2.1 HTMLCSSJS2.2 AjaxVueElementUI 3. Web核心3.1 TomcatHttpServlet3.2 RequestResponse3.3 JSP3.4 CookieSession3.5 FilterListener 1.数据库&#xff1a; 1.1 Mysql mysql&#…

HBase--技术文档--基本概念--《快速扫盲》

官网 Apache HBase – Apache HBase™ Home 阿里云hbase 云数据库HBase_大数据存储_订单风控_数据库-阿里云 云数据库 HBase-阿里云帮助中心 基本概念 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。它基于Hadoop&#xff0c;采用列式存储方式&#xff0c;可…

JAVA毕业设计095—基于Java+Springboot+Vue的酒店管理系统(源码+数据库)

基于JavaSpringbootVue的酒店管理系统(源码数据库)095 一、系统介绍 本系统前后端分离(网页端和app端都有) 本系统分为管理员、酒店管理员、酒店员工、用户四种角色(角色菜单可自行分配) 用户功能&#xff1a; 注册、登录、酒店搜索、酒店列表、酒店预订、我的收藏、我的订…