ElasticSearch是什么
ElasticSearch是一个开源的全文搜索引擎,建立在全文搜索库Apache Lucen基础之上,近实时的搜索和分析,能处理PB级别的数据,通过简单的RESTful API来影藏Lucene的复杂性。
核心概念
- Index索引:一个索引是一个文档的集合,每个索引有唯一的名字,通过这个名字来操作它。
- Document文档: 被引用的的一条数据,索引的基本信息单元,以JSON格式来表示
- field字段:组成文档中的一个单元如 “title”
- Cluster集群:一个集群有一个唯一的名字标识,具有相同的集群名的节点才会组成一个集群。
- Node节点
- Shard 分片:创建一个索引时可以指定分成多少片来存储,每个分片本身也是一个功能完善且独立的索引,分片的好处是允许我们水平切分/扩张容量,多个分片进行分布式的,并行操作,提高系统的性能和吞吐量。
倒排索引基本概念
正排索引:文档 -----> 单词
倒排索引:单词 ----->文档
正排索引:从文档角度看其中的单词,表示每个文档都包含那些单词,一个每个单词出现的位置
倒排索引:从单词角度看文档,表示每个的单词分别在那些文档中出现。以及在各自的文档中每个单词分别出现多少次。
CRUD:
1.通过RESTful API进行操作
-
创建索引
ES 服务器发 PUT 请求http://127.0.0.1:9200/shopping -
查看所有索引
向ES 服务器发 GET 请求 :http://127.0.0.1:9200/_cat/indices?v -
查看的那个索引
ES 服务器发 GET 请求 :http://127.0.0.1:9200/shopping -
删除索引
ES 服务器发 DELETE 请求 : http://127.0.0.1:9200/shopping -
创建文档
ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_doc
请求体内容为:
{
“title”:“小米手机”,
“category”:“小米”,
“images”:“http://www.gulixueyuan.com/xm.jpg”,
“price”:3999.00
}
自定义唯一性标识,需要在创建时指定: http://127.0.0.1:9200/shopping/_doc/1 -
查看文档
ES 服务器发 GET 请求 : http://127.0.0.1:9200/shopping/_doc/1 -
修改文档
ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_doc/1
请求体内容为:
{
"title":"华为手机",
"category":"华为",
"images":"http://www.gulixueyuan.com/hw.jpg",
"price":4999.00
}
- 修改字段
http://127.0.0.1:9200/shopping/_update/1
{
"doc": {
"price":3000.00
}
}
- 删除文档
ES 服务器发 DELETE 请求 : http://127.0.0.1:9200/shopping/_doc/1 - 创建映射
ES 服务器发 PUT 请求 : http://127.0.0.1:9200/student/_mapping
{
"properties": {
"name":{
"type": "text",
"index": true
},
"sex":{
"type": "text",
"index": false
},
"age":{
"type": "long",
"index": false
}
}
}
- 查询所有文档
ES 服务器发 GET 请求 : http://127.0.0.1:9200/student/_search
{
"query": {
"match_all": {}
}
}
通过API操作CRUD
创建索引对象
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//创建索引
CreateIndexRequest request = new CreateIndexRequest("user");
// 发送请求,获取响应
CreateIndexResponse response = client.indices().create(request,
RequestOptions.DEFAULT);
boolean acknowledged = response.isAcknowledged();
// 响应状态
System.out.println("操作状态 = " + acknowledged);
@Test
// 测试文档
void TestAddDocument() throws IOException {
//创建对象
User user = new User("狂神说", 3);
//创建请求
IndexRequest request = new IndexRequest("kuang_index");
// 规则
request.id("1");
request.timeout(TimeValue.timeValueSeconds(1));
request.timeout("1s");
// 将我们的数据请求放入json
request.source(JSON.toJSONString(user),XContentType.JSON);
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
// 获取文档
@Test
void testIsExists() throws IOException {
GetRequest getRequest = new GetRequest("kuang_index", "1");
// 不获取返回的_source的上下文
getRequest.fetchSourceContext(new FetchSourceContext(false));
getRequest.storedFields("_none_");
boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
// 获取文档信息
@Test
public void testGetDocument() throws IOException{
GetRequest getRequest = new GetRequest("kuang_index", "1");
GetResponse getReponse = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getReponse.getSourceAsString());
System.out.println(getReponse);
}
// 更新文档
@Test
public void testUpdate() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("kuang_index", "1");
updateRequest.timeout("1s");
User user = new User("狂神说", 18);
updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(update.status());
}
// 删除文档记录
@Test
public void testDeleteRequest() throws IOException {
DeleteRequest request = new DeleteRequest("kuang_index", "1");
request.timeout("1s");
DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
}
@Test
public void testBulkRequest() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<User> userList = new ArrayList();
userList.add(new User("kuangshen1",1));
userList.add(new User("kuangshen2",2));
userList.add(new User("kuangshen3",3));
userList.add(new User("kuangshen4",4));
userList.add(new User("kuangshen5",5));
userList.add(new User("kuangshen6",6));
userList.add(new User("kuangshen7",7));
for(int i = 0; i < userList.size(); i++){
bulkRequest.add(
new IndexRequest("kuang_index").id(""+(i+1)).source(JSON.toJSONString(userList.get(i)),XContentType.JSON
)
);
BulkResponse bulkResponse = client.bulk(bulkRequest,RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());
}
}
@Test
// 查询
/*
SearchRequest 搜索请求
SearchSourceBuilder
HighlightBuilder
MatchAllQueryBuilder
QueryBuilder
*/
public void testSearch() throws IOException {
SearchRequest searchRequest = new SearchRequest("kuang_index");
//构建搜索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "kuangshen1");
// MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
sourceBuilder.query(termQueryBuilder);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println("===========================");
for (SearchHit documentFields : searchResponse.getHits()) {
System.out.println(documentFields.getSourceAsMap());
}
}