- ElasticSearch认识
ES即为了解决原生Lucene使用的不足,优化Lucene的调用方式,并实现了高可用的分布式集群的搜索方案
特点:
- 分布式的实时文件存储
- 分布式的实时分析搜索引擎
- 扩展集群,处理PB级结构化或非结构化数据
- 高度集成的服务
- 上手简单
ElasticSearch简化了全文检索lucene的使用,同时增加了分布式的特性,使得构建大规模分布式全文检索变得非常容易。
- ElasticSearch安装与使用
注意:ES服务只依赖于JDK,推荐使用JDK1.7+
1.步骤:
- 下载ES安装包
- 运行ES bin/elasticsearch.bat
- 验证 访问http://localhost:9300/
2.Restful认识
含义: 透明性,暴露资源存在 无状态
特征:
- servlet提供Restful API中,URL中只使用名词来指定资源
- Rest是面向资源的
- 用HTTP协议里的动词来实现资源的添加 修改 删除等操作
GET 获取资源 POST新建资源 PUT更新 DELETE删除资源
Kibana5
① Kibana5.2.2下载地址:https://www.elastic.co/downloads/kibana
② 解压并编辑config/kibana.yml,设置elasticsearch.url的值为已启动的ES
③ 启动Kibana5 : bin\kibana.bat
④ 默认访问地址:http://localhost:5601
- ElasticSearch数据管理
- 是什么
- 增删改
GET 获取资源
POST 新建资源
PUT 更新
DELETE 删除资源
Bulk 批量操作
1. 简单的查询
2. 批量获取
方式一:GET _mget
{
"docs":[{
"_index":"itsource",
"_type":"blog",
"_id":"123"
},{
"_index":"itsource",
"_type":"blog",
"_id":"AWpXiEfhCq6ubXlpA9Ia",
"_source":"title"
}]
}
方式二:
GET itsource/blog/_mget
{
"ids":["123","AWpXiEfhCq6ubXlpA9Ia"]
}
1. 空搜索
GET _search
1. 分页搜索
size : 每页条数,默认 10
from : 跳过开始的结果数,默认 0
GET _search?size=5
1. 查询字符串搜索
GET crm/employees/_search?q=age:18
GET crm/employees/_search?q=age[10 TO 30]
1. DSL查询与过滤
2. DSL查询
GET crm/employees/_search
{
"query" : {
"match" : {
"name" : "麒麟璧"
}
}
}
DSL不支持缓存
1. 过滤查询
GET shop/goods/_search
{
"query":{
"bool": {
"must": [
{"match": {
"name": "iphone"
}}
],
"filter": [{
"term":{
"local":"us"
}
},{
"range":{
"price":{
"gte":"5000",
"lte":"7000"
}
}
}]
}
},
"from": 1,
"size": 5,
"_source": ["id", "name", "type","price"],
"sort": [{"price": "desc"}]
}
1. 分词与映射
2. IK分词器
① Maven打包IK插件
② 解压target/releases/elasticsearch-analysis-ik-5.2.2.zip文件
并将其内容放置于ES根目录/plugins/ik
③ 重启ES服务器
④ 测试分词器
POST _analyze
{
"analyzer":"ik_smart",
"text":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
}
1. Mapper映射
查询映射类型
GET shop/goods/_mapping
修改映射类型
(1)Delete shop;
(2)PUT shop;
(3)POST shop/goods/_mapping
{
"goods": {
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
}
}
}
}
(4)加入数据
。。。。。。
1. Java API
2. 导包
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
1. 连接ES获取client对象
#链接ES服务器 两个端口PC Java程序通过9300链接ES, 9200是WEB链接端口
public static TransportClient getClient() throws Exception {
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); return client;
}
1. DSL查询
@Test
public void getsearch() throws Exception {
// 获取客户端的es对象
TransportClient client = getClient();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 匹配 class =1
List<QueryBuilder> must = boolQueryBuilder.must();
must.add(QueryBuilders.termQuery("class","1"));
// 搜索 1班的人 过滤 age 20-25 分页 0, 3 sort id desc
// 过滤
List<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.DESC).get();
System.out.println("总条数:"+searchResponse.getHits().getTotalHits());
SearchHit[] hits = searchResponse.getHits().getHits();
// 循环数据结构
for (SearchHit hit : hits) {
System.out.println(hit.getSource());
}
// 关闭资源
client.close();
}