【ElasticSearch系列连载】5. ES入门基础与常见操作

【ElasticSearch系列连载】5. ES入门基础与常见操作

1 ES 数据格式-JSON

我们要存储的对象通常不是简单的键值对就能表示的,更多的情况是需要存储更加复杂的数据结构,比如数组、地址、嵌套结构等等。

如果我们使用传统的关系型数据库进行常见的行列存储的话,很多情况我们都需要将一些复杂的数据结构拍平,通过构造一个宽表来存储你的数据,或者需要将你的数据通过逗号分隔等形式拥挤的存储在一个字段中,每次从数据库写入和读取数据都需要进行序列化和反序列化的操作。

Elasticsearch是面向文档的,能够直接将复杂的对象进行存储,同时还能对复杂数据结构中的各个字段建立索引来让它能够被高效的检索到。在使用Elasticsearch的过程中,你建立索引的对象、搜索的对象、排序的对象以及筛选的对象都是文档,而不是行列格式的关系型数据,这是ES和其他关系型数据库最大的不同之一,以及为什么ES能够提供复杂的全文搜索。

ElasticSearch使用JSON (JavaScript Object Notation) 作为文档的存储结构。目前绝大多数语言都能友好地支持JSON格式数据的转化与传输,也是大多数NoSQL类型数据库的存储标准。

一条注册用户信息的JSON文档如下:

{
    "email": "josiah@zhao.com",
    "name": "josiah",
    "info": {
        "bio": "工期短、质量好、成本低,这三项里面你最多只能同时做到两项", 
        "age": 25,
        "interests": [ "游泳", "钢琴" ]
    },
    "login_time": "2022/01/01" 
}

可以看到,虽然用户的原始信息有嵌套,数组和日期等相对复杂的结构,但是通过JSON的格式进行读写与展示就会容易很多。远比使用关系型数据库存储考虑如何将复杂结构拍平存储转化要简单的多。

2 索引的概念

在ElasticSearch中,每一个文档数据有一个"类型" (type) ,type是属于"索引" (index) 。他们的关系和关系型数据库相比如下:

关系型数据库 (如MySQL) :数据库 (Database) => 数据表 (Table) => 行 (Row) => 列 (Column)
ElasticSearch:索引 (Index) => 类型 (Type) => 文档 (Document) => 属性 (Field)

注意,在V2.X中,一个Index的类型可以有多个,但是在V7.0以及之后的版本中Type被废弃了。一个Index中只有一个默认的Type,即 _doc。

和索引相关的几个概念。

索引 (Index)

如上文所述,名词的索引就是好比数据库,用来存储各个文档。

对文档建索引 (Index)

对一个文档建索引,就是将文档写入一个用来存储文档的索引,就好比是SQL的insert语句一样。

倒排索引 (Inverted index)

好比关系型数据库能够在字段上建立B-tree索引一样,来提升字段的查询效率。ElasticSearch和Lucene也使用一种数据库来加速文档字段的搜索,这个数据结构就叫做"倒排索引"。在默认的情况下,ElasticSearch会对文档中的所有字段都建立倒排索引。

3 用户数据存储场景实例

现在,我们要对一批用户数据"建索引",需要满足如下的要求:

  1. 允许每一条用户数据存储多个标签,数字和文本
  2. 可以获取任意用户的完整信息
  3. 允许结构化条件搜索,比如搜索年龄大于25岁的用户
  4. 允许简单的全文搜索和复杂的短语搜索
  5. 可以将匹配搜索词的内容进行高亮标记
  6. 可以在数据上做统计分析

3.1 对文档建立索引

我们使用下面的三个curl请求对3个用户建立索引。

其中:

  • “my_user_list” 就是索引的名称
  • “_doc” 是索引的类型(如上文所述,7.0之后类型固定只能是_doc)
  • “_doc” 之后的数字是文档的唯一标识,我们分别写入了id为1,2,3的三个用户文档数据
  • “-d” 之后的JSON格式数据是录入的用户数据,分别是张三,李四和王五

我们可以看到,向ElasticSearch的索引中写入数据,不需要对索引做任何的初始化,ElasticSearch会自动感知数据的每一个字段,自动初始化索引的类型,自动建立倒排索引等等;除非特殊情况,不需要用户再做任何的初始化。

curl -H "Content-Type: application/json" -XPOST 'http://localhost:9200/my_user_list/_doc/1' -d '
{
    "name": "张三",
    "info": {
        "bio": "工期短、质量好、成本低,这三项里面你最多只能同时做到两项", 
        "age": 25,
        "interests": [ "游泳", "钢琴" ]
    },
    "login_time": "2022/01/01" 
}
'

curl -H "Content-Type: application/json" -XPOST 'http://localhost:9200/my_user_list/_doc/2' -d '
{
    "name": "李四",
    "info": {
        "bio": "钱多、事少、离家近,这三项里面你最多只能同时做到两项", 
        "age": 22,
        "interests": [ "篮球", "钢琴" ]
    },
    "login_time": "2022/02/01" 
}
'

curl -H "Content-Type: application/json" -XPOST 'http://localhost:9200/my_user_list/_doc/3' -d '
{
    "name": "王五",
    "info": {
        "bio": "提高效率、降低成本、满足定制,这三项里面你最多只能同时做到两项", 
        "age": 21,
        "interests": [ "游泳", "羽毛球" ]
    },
    "login_time": "2022/03/01" 
}
'

3.2 获取文档

现在,我们要获取其中一个用户的数据文档,我们只需要发起一个GET请求,将要获取的文档id传入即可,如下。

  • “my_user_list” 就是索引的名称
  • “_doc” 是索引的类型(如上文所述,7.0之后类型固定只能是_doc)
  • “_doc” 之后的数字是文档的唯一标识,这里我们获取id为1的文档
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
co.elastic.clients.elasticsearch.core.aggregations 是 Java 客户端 ElasticSearch 的一个聚合(Aggregation)方法,用于对数据进行分析和统计。 具体使用方法可以参考以下示例: ```java import co.elastic.clients.base.*; import co.elastic.clients.elasticsearch.*; import co.elastic.clients.elasticsearch.core.*; import co.elastic.clients.elasticsearch.core.aggregations.*; import co.elastic.clients.elasticsearch.core.aggregations.bucket.*; import co.elastic.clients.elasticsearch.core.aggregations.metrics.*; import java.io.IOException; import java.util.*; public class ElasticSearchAggregationExample { public static void main(String[] args) throws IOException, ApiException { RestClientBuilder restClientBuilder = RestClient.builder( new HttpHost("localhost", 9200, "http") ); ElasticSearch client = new ElasticSearch(restClientBuilder); SearchRequest request = new SearchRequest() .index("my_index") .source(new SearchSource() .query(new MatchAllQuery()) .aggregations(new TermsAggregation("my_terms_agg") .field("my_field") .size(10) .subAggregations(new AvgAggregation("my_avg_agg") .field("my_other_field") ) ) ); SearchResponse response = client.search(request); TermsAggregationResult myTermsAggResult = response.aggregations().terms("my_terms_agg"); for (TermsAggregationEntry entry : myTermsAggResult.buckets()) { String term = entry.keyAsString(); long count = entry.docCount(); AvgAggregationResult myAvgAggResult = entry.aggregations().avg("my_avg_agg"); double avg = myAvgAggResult.value(); System.out.println(term + ": " + count + ", avg: " + avg); } client.close(); } } ``` 这个例子展示了如何使用 co.elastic.clients.elasticsearch.core.aggregations 方法来进行聚合查询。在这个例子中,我们使用了 TermsAggregation 和 AvgAggregation 两个聚合方法,对数据进行了分组和统计。具体步骤为: 1. 创建一个 SearchRequest 对象,并设置索引名称和查询条件。 2. 在查询条件中添加聚合条件。这里使用了 TermsAggregation 来对数据进行分组,然后使用 AvgAggregation 来统计每个分组的平均值。 3. 执行查询,并获取查询结果。 4. 使用聚合结果对象的方法来获取聚合结果,然后对结果进行处理。 需要注意的是,聚合方法的具体参数和用法可以参考 ElasticSearch 官方文档。同时,Java 客户端的版本和 ElasticSearch 的版本也需要匹配,否则可能会出现兼容性问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值