目录
拓展:
1.ECMAScript:前端java语法规范协议
2.搜索方向----搜索工程师
3.RESTful:表述性状态转移,较好地控制状态资源转换
## ElasticSearch基础:
java开发,底层为lucene的开源高扩展分布式全文搜索引擎,能够近乎实时地存储、检索数据,可处理PB级别的数据量
区别:
Solr:
1.Solr利用Zookeeper进行分布式管理
2.Solr支持更多格式数据
3.Solr官方提供的功能很多
4.适用于传统搜索应用
ES:
1.ES自带分布式协调管理功能,更方便
2.ES仅支持json格式
3.ES更注重核心功能,高级功能由第三方提供
4.适用于实时搜索应用
对比:关系型数据库
Databases -----> Index 索引库
Table -----> Type 类型(区分数据种类)
Row -----> Document 文档{key1:value1,key2:value2...}
Column -----> Field 文档key值
Schema -----> Mapping 映射
ES安装注意:
1.跨域请求:修改配置文件config/elasticSearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 127.0.0.1
[注意]:
由于是yml文件,故在:后面留意空格
2.内存容量:修改配置文件config/jvm.options
-Xms2g
-Xmx2g
3.最好JDK1.8及以上
4.若使用的插件发生变动或更换,应当及时清理对应data目录下的分词数据,否则报错
默认端口:
9300: 为后端Java开发暴露的端口,方便开发调用
9200: 为浏览器访问暴露的端口,方便可视化访问
分词器设置:IK
第三方分词器插件需放置在plugins目录下,文件夹名无所谓,最好见名知意后期方便维护
[注意]:
本地添加插件后,开发时需要特别配置mappings声明使用此分词器,之后才生效(后续进阶篇介绍)
其他相关概念:(后续进阶篇介绍)
1.Near RealTime
2.Cluster
3.Node
4.分片与复制shards&replicas
## 其他组件:
由于ES不同于Solr官方提供了可视化界面,需要自己安装其他插件进行索引库可视化处理,方便后期观察与操作
图形化界面插件:head-master(BS项目)
使用js开发的服务工具,需要Node.js组件支持
安装:直接解压即可
安装Node.js组件:
支持Javascript在服务器端运行的平台,需要Grunt组件支持
启动:grunt server
端口:9100
安装Grunt组件:
启动js项目的项目构建工具
安装:npm install -g grunt -cli
[注意]:
若安装较为缓慢可以提前使用npm指令安装cnpm组件,然后使用相应cnpm指令从国内服务器上下载资源
上述组件全部安装完毕后本地访问localhost:9100查看是否显示图形界面
## ES入门:
导入依赖
elasticSearch、transport
查询方法:QueryBuilders对象
所有查询: .matchAllQuery()
字符串查询: .queryStringQuery(...)
词条查询: .termQuery(key, value)
模糊查询: .wildcardQuery(key,value)
[注意]:
模糊查询通常按分词结果结合通配符进行查询,故分词器的不同也会对查询造成影响
索引库操作:添加一条记录
1.创建客户端连接PreBuiltTransportClient对象
[注意]:
由于默认存在集群,若不使用则需要添加参数Settings.EMPTY
2.与ES服务建立连接,获取TransportClient对象
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(#IP), #port));
3.使用XContentFactory对象组装文档信息(json格式)
XContentFactory.jsonBuilder().startObject().field(key,value).[field(key2,value2)...]endObject();
4.使用连接对象创建索引库,并添加文档信息
.prepareIndex(#index, #type, #id).setSource(#XContentFactory).get();
[注意]:
1.此处创建索引库时指定的id为此类型索引库对应的一条索引记录id,不可重复,否则将造成数据覆盖现象,
概念上此处id相当于关系型数据库主键,type为索引库索引记录分类依据,相当于关系型数据库中表级别
2.根据源码可知结尾处调用的.get()方法实际上是执行操作的方法,内含.execute()
5.关闭资源
// 创建客户端对象
PreBuiltTransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY);
// 准备连接对象
TransportClient client = transportClient.addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
// 构建文档信息 {id:"1", title:"aaa", content:"bbb"}
XContentBuilder jsonBuilder = XContentFactory.jsonBuilder();
jsonBuilder
.startObject()
.field("id","1")
.field("title","aaa")
.field("content","bbb")
.endObject();
// 创建索引库,并添加文档信息
client.prepareIndex("blog1","article","1").setSource(jsonBuilder).get();
// 关闭资源
client.close();
查询操作:查询所有
1.创建客户端连接对象
2.与ES服务建立连接
3.调用方法组装目标索引库信息,创建SearchRequestBuilder查询对象
.prepareSearch(index).setTypes(type).setQuery(QueryBuilders.matchAllQuery());
4.获取响应结果SearchResponse对象
.get()
5.获取命中结果,并进行处理
.getHits()
6.关闭资源
[注意]:
由于1-2步基本所有ES操作都要使用,可以直接抽取成工具类,之后获取连接对象使用即可
// 获取ES的连接对象
TransportClient client = ESUtil.createTransportClient();
// 执行查询
SearchRequestBuilder searchRequest = client.prepareSearch("blog1").setTypes("article")
.setQuery(QueryBuilders.matchAllQuery());
// 获取响应结果
SearchResponse searchResponse = searchRequest.get()
// 获取命中结果,处理
SearchHits searchHits = searchResponse.getHits();
System.out.println("命中"+searchHits.getTotalHits()+"条");
Iterator<SearchHit> iterator = searchHits.iterator();
while(iterator.hasNext()){
SearchHit searchHit = iterator.next();
System.out.println(searchHit.getSourceAsString());
}
// 关闭资源
client.close();