应用到的数据库:Elasticsearch、Milvus
一、Elasticsearch
1.1 简介
Elasticsearch 是一个分布式的、基于 RESTful API 的搜索和分析引擎,广泛用于大规模的数据存储和快速检索。(就是一个数据库)
1.2 ES中的基本概念
ES的基本概念除了集群、节点之外,还有:索引、Mapping、文档、字段、分词、分词器、分片、副本、倒排索引。
-
索引:索引是某一类文档的集合,类似Mysql的数据库。
-
Mapping:Mapping是定义索引中有哪些字段,以及字段类型,以及字段是否会分词等,类似数据库中定义的表结构。
-
文档:文档就是索引里的一条记录,类似数据库表中的一行记录。
-
字段:文档有一个或多个字段,每个字段有指定的类型,常用的类型有:keyword、text、数字类型(integer、long、float、double等)、日期类型、对象类型等。
类型是text类型时,创建文档时ES会对该字段进行分词操作,其余类型则不会做分词。 -
分词:ES里最核心的概念就是分词了,ES会对text类型的字段进行分词,分词后就会得到一个个的词项,常用Term表述。
-
分词器:ES里有各种各样的分词器,用于不用场景下对text类型的字段进行分词。
-
分片:分片实际上是将某个索引的数据切分成多个块,然后均匀地将各个块分配到集群里的各个Node节点上。可以通过ES的策略查找数据块所在的Node。
这种方案是面向海量数据而设计的,这样数据可以分布在各个节点上,数据量扩张时通过扩充Node数量来快速解决。 -
副本:只要涉及到分布式的场景,几乎都有副本的概念。副本主要是为了备份数据,保障数据的安全性。同时也可以将查询请求分摊到各个副本里,缓解系统压力,提高吞吐量。
ES里的数据分为主分片和副本分片,写数据时先写入主分片,然后在异步写入副本分片。 -
倒排索引:比如我们常用的数据库索引,是把索引字段建立目录,保存目录和数据的关系,然后根据目录去查找文档,使用 B+ 树来实现。
但是倒排索引(又称反向索引),是根据分词后的Term与文档建立关系,每个Term都对应着一堆文档,然后搜索文本时先将文本分词,然后去匹配Term,然后再去根据匹配的得分找出相关文档。
1.3 DSL查询文档
Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
- 查询所有:查询出所有数据,一般测试用。例如:match_all
- 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:match_query、multi_match_query
- 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。
- 地理(geo)查询:根据经纬度查询。
- 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。
1、查询所有文档:
GET /order/_search
{
"query":{
"match_all":{
}
}
}
2、全文检索(full text)查询:
match查询,查询字段name中包含5G的文档
GET /order/_search
{
"query":{
"match": {
"name": "5G"
}
}
}
multi_match查询,返回字段name或者user.address.keyword包含天津市的文档
GET /order/_search
{
"query":{
"multi_match": {
"query": "天津市",
"fields": ["user.address.keyword","name"]
}
}