Elasticsearch 是一个基于 JSON 的非关系型数据库。
技术选型
mongodb:增删改查
es:大数据搜索
lucene:分布式搜索
倒排索引
- 正排索引:适用于快速按照文档顺序访问和检索。
- 倒排索引:适用于关键词查询。根据分词找到文档id,根据文档id找到文档。
索引:帮助快速搜索,以数据结构为载体,以文件的形式落地。
- 切词:word segmentation
- 规范化:normalization
- 去重:distinct
- 字典序:sorted
日志采集 ELK
- LogStash 筛选
- ElasticSearch 存储
- Kibana 可视化
数据结构
Elasticsearch 的数据结构是基于文档和索引的。每个文档代表一个数据实体,每个索引代表一个数据集合。每个文档可以包含多个字段,每个字段可以是不同的数据类型,例如文本、数字、日期等等。
相关代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| // 创建一个 Elasticsearch 客户端对象
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 执行一个聚合操作
SearchRequest request = new SearchRequest("my_index");
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.aggregation(AggregationBuilders.terms("by_user").field("user"));
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 解析聚合结果
Terms byUser = response.getAggregations().get("by_user");
for (Terms.Bucket bucket : byUser.getBuckets()) {
String user = bucket.getKeyAsString();
long count = bucket.getDocCount();
System.out.println(user + ": " + count);
}
// ------------------------------------------------------------------
// 构建一个查询条件
SearchRequest request = new SearchRequest("my_index");
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.matchQuery("message", "hello"));
request.source(builder);
// 执行查询操作
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 解析查询结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
String id = hit.getId();
String message = hit.getSourceAsMap().get("message").toString();
System.out.println(id + ": " + message);
}
// 关闭 Elasticsearch 客户端对象
client.close();
|
- 创建一个 Elasticsearch 客户端对象 RestHighLevelClient
- 创建索引 CreateIndexRequest
- 添加一个文档 IndexRequest
- 更新一个文档 UpdateRequest
- 删除一个文档 DeleteRequest
- 搜索文档 SearchRequest
- 查询条件 SearchSourceBuilder
- 查询结果 SearchHits