ElasticSearch
- 1.ElasticSearch(简称ES)
ES即为了解决原生Lucene使用的不足,优化Lucene的调用方式,并实现了高可用的分布式集群的搜索方案,其第一个版本于2010年2月出现在GitHub上并迅速成为最受欢迎的项目之一。
首先,ES的索引库管理支持依然是基于Apache Lucene™的开源搜索引擎。
ES也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的
RESTfulAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。 不过,ES的核心不在于Lucene,其特点更多的体现为:
分布式的实时文件存储,每个字段都被索引并可被搜索 分布式的实时分析搜索引擎 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
高度集成化的服务,你的应用可以通过简单的 RESTful API、各种语言的客户端甚至命令行与之 交互。
上手Elasticsearch非常容易。它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它拥有开瓶即饮的效果(安装即可使用),只需很少的学习既可在生产环境中使用
。
- 3.辅助管理工具Kibana5
① Kibana5.2.2下载地址:https://www.elastic.co/downloads/kibana
② 解压并编辑config/kibana.yml,设置elasticsearch.url的值为已启动的ES
③ 启动Kibana5 : bin\kibana.bat
④ 默认访问地址:http://localhost:5601
Discover:可视化查询分析器
Visualize:统计分析图表
Dashboard:自定义主面板(添加图表)
Timelion:Timelion是一个kibana时间序列展示组件(暂时不用)
Dev Tools :Console(同CURL/POSTER,操作ES代码工具,代码提示,很方便)
Management:管理索引库(index)、已保存的搜索和可视化结果(save objects)、设置 kibana 服务器属性。
- 4.ES数据管理
ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。
ES使用Javascript对象符号(JavaScript Object Notation),也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。_index:索引库,类似于关系型数据库里的“数据库”—它是我们存储和索引关联数据的地方。
_type:在应用中,我们使用对象表示一些“事物”,例如一个用户、一篇博客、一个评论,或者一封邮件。可以是大写或小写,不能包含下划线或逗号。我们将使用
employee 做为类型名。
_id:与 _index 和 _type 组合时,就可以在ELasticsearch中唯一标识一个文档。当创建一个文档,你可以自定义 _id ,也可以让Elasticsearch帮你自动生成。 另外还包括:_uid文档唯一标识(_type#_id)
_source:文档原始数据
_all:所有字段的连接字符串
- 5.分词与映射
IK分词器
IK分词器有两种类型,分别是ik_smart分词器和ik_max_word分词器。 ik_smart:
会做最粗粒度的拆分,比如会将“*国歌”拆分为“*,国歌”。 ik_max_word:
会将文本做最细粒度的拆分,比如会将“*国歌”拆分为“*,
文档映射Mapper
① 基本字段类型
字符串:text(分词),keyword(不分词) StringField(不分词文本),TextFiled(要分词文本)
text默认为全文文本,keyword默认为非全文文本
数字:long,integer,short,double,float
日期:date
逻辑:boolean
② 复杂数据类型
对象类型:object
数组类型:array
地理位置:geo_point,geo_shape
- 6.java代码操作
1.连接es服务器
public static TransportClient getClient() throws Exception{
// 连接es服务器,两个端口pc java程序通过9300连接es 9200是web连接端口
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"),9300));
return client;
}
2.添加
@Test
public void testGreated() throws Exception{
// 获取client对象
TransportClient client = getClient();
IndexRequestBuilder indexRequestBuilder = client.prepareIndex("crm", "user", "1");
Map<String,Object> mp = new HashMap();
mp.put("id", 2);
mp.put("name", "我是添加");
mp.put("age", 18);
IndexResponse indexResponse = indexRequestBuilder.setSource(mp).get();
System.out.println(indexRequestBuilder);
}
3.更新存在文档
@Test
public void testupdate() throws Exception{
// 连接ES获取Client对象
TransportClient client = getClient();
Map<String,Object> mp = new HashMap();
mp.put("id", 2);
mp.put("name", "我是更新的数据");
mp.put("age", 19);
UpdateResponse updateResponse = client.prepareUpdate("crm", "user", "1").setDoc(mp).get();
System.out.println(updateResponse);
}
4.删除文档
@Test
public void testDelete() throws Exception{
TransportClient client = getClient();
DeleteResponse deleteResponse = client.prepareDelete("crm", "user", "1").get();
System.out.println(deleteResponse);
}
5.批量操作
@Test
public void testBulk() throws Exception{
// 获取客户端es对象
TransportClient client = getClient();
// 批量请求对象
BulkRequestBuilder builder = client.prepareBulk();
for (int i=0;i<15;i++){
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", i);
map.put("name", "crm"+i);
map.put("age", 18+i);
map.put("class", 1);
builder.add(client.prepareIndex("crm","user",i+"").setSource(map));
}
// 提交请求
BulkResponse bulkItemResponses = builder.get();
if (bulkItemResponses.hasFailures()){
System.out.println("error");
}
client.close();
}
6.条件查询
- 1班的人 过滤 age 20-25 分页 0, 3 sort id desc
@Test
public void testSearch() throws Exception{
// 获取客户端es对象
TransportClient client = getClient();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 匹配 class=1
List<org.elasticsearch.index.query.QueryBuilder> must = boolQueryBuilder.must();
must.add(QueryBuilders.termQuery("class", "1"));
// 搜索 1班的人 过滤 age 20-25 分页 0, 3 sort id desc
List<org.elasticsearch.index.query.QueryBuilder> filter = boolQueryBuilder.filter();
filter.add(QueryBuilders.rangeQuery("age").gte(20).lte(25));
// 设置分页 排序 order by id desc
SearchResponse searchResponse = client.prepareSearch("crm").setFrom(0).setSize(3)
.setQuery(boolQueryBuilder)
.addSort("id", SortOrder.ASC).get();
System.out.println("总条数:"+searchResponse.getHits().getTotalHits());
SearchHit[] hits = searchResponse.getHits().getHits();
for(SearchHit hit :hits){
System.out.println(hit.getSource());
}
client.close();
}
推荐阅读
-
Elasticsearch——》es近义词(同义词)配置
-
docker容器间使用network通信,示例:elasticsearch & kibana
-
ElasticSearch7笔记:基本操作and批量操作
-
elasticsearch启动警告无法锁定JVM内存
-
springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服务的坑
-
使用java操作elasticsearch的具体方法
-
Windows下安装ElasticSearch的方法(图文)
-
详解spring-boot集成elasticsearch及其简单应用
-
基于Elasticsearch5.4的常见问题总结
-
Spring Boot整合elasticsearch的详细步骤