官网
https://www.elastic.co/cn/products/elasticsearch
优点
1.扩展性好,可部署上百台服务器集群,处理PB级数据 。B KB MB GB TB PB ZB
2.近实时的去索引数据、搜索数据。
索引结构
下图是ElasticSearch的索引结构,下边黑色部分是物理结构,上边黄色部分是逻辑结构,逻辑结构也是为了更好的去描述ElasticSearch的工作原理及去使用物理结构中的索引文件。
逻辑结构部分是一个倒排索引表:
1、将要搜索的文档内容分词,所有不重复的词组成分词列表。
2、将搜索的文档最终以Document方式存储起来。
3、每个词和docment都有关联。
安装
bin:脚本目录,包括:启动、停止等可执行脚本
config:配置文件目录
data:索引目录,存放索引文件的地方
logs:日志目录
modules:模块目录,包括了es的功能模块
plugins :插件目录,es支持插件机制
配置文件
ES的配置文件的地址根据安装形式的不同而不同:
使用zip、tar安装,配置文件的地址在安装目录的confifig下。
使用RPM安装,配置文件在/etc/elasticsearch下。
使用MSI安装,配置文件的地址在安装目录的confifig下,并且会自动将confifig目录地址写入环境变量 ES_PATH_CONF。
本教程使用的zip包安装,配置文件在ES安装目录的confifig下。
配置文件如下:
elasticsearch.yml : 用于配置Elasticsearch运行参数 jvm.options : 用于配置Elasticsearch JVM设置
log4j2.properties: 用于配置Elasticsearch日志
elasticsearch.yml
配置格式是YAML,可以采用如下两种方式:
方式1:层次方式
path: data: /var/lib/elasticsearch logs: /var/log/elasticsearch
方式2:属性方式
path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch
本项目采用方式2,例子如下:
cluster.name: xuecheng node.name: xc_node_1 network.host: 0.0.0.0 http.port: 9200 transport.tcp.port: 9300 node.master: true node.data: true #discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302"] discovery.zen.minimum_master_nodes: 1 bootstrap.memory_lock: false node.max_local_storage_nodes: 1 path.data: D:\ElasticSearch\elasticsearch‐6.2.1\data path.logs: D:\ElasticSearch\elasticsearch‐6.2.1\logs http.cors.enabled: true http.cors.allow‐origin: /.*/ |
注意path.data和path.logs路径配置正确。
依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.5.4</version>
</dependency>
创建索引库
@Override
public void createIndex() throws Exception {
CreateIndexRequest createIndexRequest = new CreateIndexRequest("tb_sku");
createIndexRequest.settings(Settings.builder().put("number_of_shards", "1").put("number_of_replicas", "0"));
createIndexRequest.mapping("doc","{\n" +
"\t\"properties\": {\n" +
"\t\t\"id\": {\n" +
"\t\t\t\"type\": \"text\"\n" +
"\t\t},\n" +
"\t\t\"sn\": {\n" +
"\t\t\t\"type\": \"text\",\n" +
" \"analyzer\": \"ik_max_word\",\n" +
"\t\t\t\"search_analyzer\": \"ik_smart\"\n" +
"\t\t},\n" +
"\t\t\"name\": {\n" +
"\t\t\t\"type\": \"keyword\"\n" +
"\t\t},\n" +
" \"image\":{\n" +
" \"type\":\"text\",\n" +
" \"index\":false\n" +
" }\n" +
"\t}\n" +
"}", XContentType.JSON);
CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
System.out.println(createIndexResponse.index());
}
全部查询
public void query1() throws Exception{
//创建查询请求对象
SearchRequest searchRequest = new SearchRequest("tb_sku");
searchRequest.types("doc");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT.DEFAULT);
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
String id = hit.getId();
String index = hit.getIndex();
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
System.out.println(sourceAsMap);
}
}
分页查询(指定起始位置和数据个数)
SearchRequest searchRequest = new SearchRequest("tb_sku");
searchRequest.types("doc");
//创建查询语句对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.from(0);
searchSourceBuilder.size(20);
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(searchSourceBuilder);
精准查询
SearchRequest searchRequest = new SearchRequest("tb_sku");
searchRequest.types("doc");
//创建查询语句对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("id","100000006163"));
searchRequest.source(searchSourceBuilder);
分词查询
SearchRequest searchRequest = new SearchRequest("tb_sku");
searchRequest.types("doc");
//创建查询语句对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("sn","java开发")
.operator(Operator.OR).minimumShouldMatch("80%"));
searchRequest.source(searchSourceBuilder);
多条件查询
SearchRequest searchRequest = new SearchRequest("tb_sku");
searchRequest.types("doc");
//创建查询语句对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//分词查
MultiMatchQueryBuilder multiMatchQueryBuilder = new MultiMatchQueryBuilder("java开发","sn");
//精准查
TermsQueryBuilder termsQueryBuilder = new TermsQueryBuilder("id","100000006163");
//创建多条件查询
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
boolQueryBuilder.must(multiMatchQueryBuilder);
boolQueryBuilder.must(termsQueryBuilder);
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
添加数据到索引库
public void addDoc() throws IOException {
QueryWrapper<TbSkuModel> queryWrapper = new QueryWrapper<>();
queryWrapper.last("limit 50");
List<TbSkuModel> list = tbSkuService.list(queryWrapper);
Map<String, Object> jsonMap = new HashMap<>();
IndexResponse indexResponse=null;
for (TbSkuModel model : list) {
jsonMap.put("id",model.getId());
jsonMap.put("image", model.getImage());
jsonMap.put("name", model.getName());
jsonMap.put("sn", model.getSn());
IndexRequest indexRequest = new IndexRequest("tb_sku", "doc");
indexRequest.source(jsonMap);
indexResponse = client.index(indexRequest);
}
DocWriteResponse.Result result = indexResponse.getResult();
System.out.println(result);
}
删除索引库
public void deleteIndex() throws Exception {
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("tb_sku");
AcknowledgedResponse acknowledgedResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println(acknowledgedResponse.isAcknowledged());
}
删除索引库数据
public void deleteDoc() throws Exception {
DeleteRequest deleteRequest = new DeleteRequest("tb_sku", "doc", "2");
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
}
更新索引库数据
public void updateDoc() throws Exception {
UpdateRequest updateRequest = new UpdateRequest("tb_sku", "doc", "2");
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("id","qqq");
jsonMap.put("image", "test11");
jsonMap.put("name","111");
jsonMap.put("sn", "1122");
updateRequest.doc(jsonMap);
UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(update);
}