Elasticsearch简介
Elasticsearch是一个开源的数据库,是由Elastic公司开发的,基于lucen基础架构,使用Java语言开发的一个支持多集群,高亮,快速搜索的数据库,由于其天生支持多集群分布式,逐渐超越sloar从而在企业中得到广泛的使用
Elasticsearch基础概念
es和传统的数据库,相对,一些概念的比较如下
Elasticsearch | RDMB |
---|---|
数据库 | 索引 |
表 | type |
行 | docId |
需要注意的是在es 7.x后面的版本中,type 默认为 “_doc”,一个数据库中不支持多个表,据官方说是为了提高表的查询效率,由于数据库中的每一个表都要建立一个倒排索引,多个的话,增加复杂度
Elasticsearch倒排索引
es之所以那么快,查询起来效率这么高,主要还是es插入数据的索引机制,同样可以与RDMB数据库做一个关系类比,我们知道mysql查询这么快,是由于建立了B+树,内部建立了数状的索引,这种称之为正排索引,相反,es建立的索引成为倒排索引,在数据插入的时候,就对数据进行了统计,将每一个document经过分词,分词之后统计出现数目的频数,这样查询的时候就可以,根据查询的词快速定位到某一个数目,同时,由于创建的时候,统计的频数,可以对具体内容进行排序,可以类比于百度的搜索排名
Elasticsearch DSL表达式基础语法
介绍es的基础语法之前,简单介绍一下,es的数据类型,数据类型主要为keyword,text,text的数据类型支持进行分词,同样查询的时候,可以进行模糊匹配,类似于mysql中的 ‘like’ 关键字,而keyword类型的数据就只能精准匹配,类似于 ‘==’ ,对数据的处理,无外乎增删改查询,所以将DSL表达式的操作整理为以下几种:
查询
# 精准搜索
GET xxx/_search
{
"query": {
"term": {
"xxx": {
"value": "andshza"
}
}
}
}
# 范围查找
GET xxx/_search
{
"query": {
"terms": {
"xx": [
"xx",
"xx"
]
}
}
}
删除
POST /my-index-000001/_delete_by_query
{
"query": {
"match": {
"user.id": "elkbee"
}
}
}
Elasticsearch Java api的使用
es的Java 客户端主要有以下几种,resHighClient ,restLowClient,两种都支持res形式的接口,这里使用resHighClient进行介绍
首先第一步需要引入相关的jar包,这里引入的依赖如下:
`<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.4.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-cli</artifactId>
<version>6.4.3</version>
<scope>compile</scope>
</dependency>`
相关的操作es的api如下:
/**
* 更新
*/
public UpdateResponse updateData(String index, String type, String id, Object source) throws IOException {
UpdateRequest updateRequest = new UpdateRequest(index, type, id).doc(JSONObject.toJSONString(source),XContentType.JSON);
return client.update(updateRequest, RequestOptions.DEFAULT);
}
/**
* 插入
*/
public IndexResponse insertData(String index, String type, String id, Map source) throws IOException {
IndexRequest indexRequest = new IndexRequest(index, type, id);
indexRequest.source(source, XContentType.JSON);
return client.index(indexRequest, RequestOptions.DEFAULT);
}
/**
* 删除
*/
public DeleteResponse deleteData(String index, String type, String id) throws IOException {
DeleteRequest deleteRequest = new DeleteRequest(index, type, id);
return client.delete(deleteRequest, RequestOptions.DEFAULT);
}
/**
* 查询index下所有数据
*/
public SearchResponse searchIndex(String index, String type) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
searchSourceBuilder.query(matchAllQueryBuilder);
SearchRequest request = new SearchRequest();
request.indices(index);
request.types(type);
request.source(searchSourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}