https://www.bilibili.com/video/av21943111/?spm_id_from=333.788.videocard.3
Elastic Search 简称ES,支持PB级的结构化或者非结构化数据处理;
(一)ES 单实例的安装
1. 下载链接:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.tar.gz
2.tar -zxvf 解压下载的tar.gz 包
3.进入解压后的elasticsearch目录中,进入bin 目录
4. ./elasticsearch 启动 默认端口9200
安装插件head 提供友好的web 界面(需要node 环境>6.0):
1.GitHub 查找 elasticsearch-head 进行下载
2.进入解压后的目录 执行 npm install
3.修改elasticsearch 安装目录下 config目录 下的 elasticsearch.yml
4.添加跨域请求配置:
http.cors.enabled: true http.cors.allow-origin: "*"
5.npm run start 启动head
---------至此,单示例的安装就算完成了
(二)ES 集群部署的安装:
集群部署的安装主要是操作config 目录下的 elasticsearch.yml 文件
我们首先看master 的配置:
#配置cluster 名字 cluster.name: iscys #节点的名字 node.name: master #表明当前的节点是master node.master: true
#绑定的端口,默认9200
network.host: 127.0.0.1
我们看slave 的配置:
#名字要与主节点一致(集群这个名字都要一致)
cluster.name: iscys
#节点的名字 node.name: slave network.host: 127.0.0.1
#端口 http.port: 8200
#用于发现主节点
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
****注意:在Linux 中安装运行,必须是非root 用户并且文件夹所属也是该用户,使用chown 进行文件所属的修改
常见报错解决方案:
http://blog.itpub.net/15498/viewspace-2149328/
Elastic Search 索引是反向索引又叫倒排索引,根据文章内容中关键字进行建立索引
主要要了解索引 类型 文档 这三个模型概念
索引是用于存放数据的地方,可以用来理解为mysql中的一个数据库
类型是用于定义数据结构的,可以理解为mysql 的一张表,类型我们可以通过Mapping 来定义每个字断的类型
文档就说最终的数据
-----
API 基本格式:
http://<ip>:<port>/<索引>/<类型>/<文档ID>
使用postman进行索引类型的创建 put 请求 127.0.0.1:9200/book
{
"settings":{
"number_of_shards": 3,//分片数
"number_of_replicas":1//副本数
}
,
"mappings":{
"books" :{
"properties":{
"id":{
"type":"integer"//in t
},
"name":{
"type":"text"
},
"author":{
"type":"text"
},
"country":{
"type":"keyword"//改字段不会被切分
},
"date":{
"type":"date",
"format":"yyyy-MM-dd||epoch_millis"
}
}
}
}
}
经过上面操作就会在es 中添加book的索引以及索引类型的映射books;
Rest API 操作(基于SpringBoot):
pom 文件:
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>5.5.2</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.5.2</version> </dependency>
2.配置client 端:
@Bean public TransportClient esClient(){ InetSocketTransportAddress address =new InetSocketTransportAddress(new InetSocketAddress("127.0.0.1",9300)); Settings settings =Settings.builder().put("cluster.name","iscys").build(); TransportClient client = new PreBuiltTransportClient(settings); client.addTransportAddress(address); return client; }
3.构造添加es 文档信息api: 返回文档唯一ID
Books books =new Books(); books.setAuthor("iscys"); books.setCountry("运城"); books.setDate(new Date().getTime()); books.setId(2); books.setName("武侠小说"); byte[] bytes = bi.writeValueAsBytes(books); IndexResponse indexResponse = client.prepareIndex("book", "books").setSource(bytes, XContentType.JSON).get(); String id = indexResponse.getId(); System.out.println(id);
4.查询这个是重点,需要一步一步的挖掘:->具体请看--->https://juejin.im/post/5b7fe4a46fb9a019d92469a9#heading-17
查询主要使用的是 QueryBuilders 进行构建查询器,然后指定索引以及类型进行查询
(1). 查询所有的文档(match_all):
//预查询指定索引 SearchRequestBuilder search = client.prepareSearch("book"); //构建一个匹配所有的文档的查询器 MatchAllQueryBuilder match_all = QueryBuilders.matchAllQuery(); System.out.println(match_all); SearchResponse books = search .setTypes("books") .setQuery(match_all)//指定查询器 .get(); System.out.println(books.toString());
我们通过打印可以看到match_all其向服务器发送的json 如下:
{ "match_all" : { "boost" : 1.0 } }
(2). 查询指定字段的文档(match 模糊匹配)
//预查询指定索引 SearchRequestBuilder search = client.prepareSearch("book"); //构建一个匹配指定字段的选择器 name 字段(field) 内容是陈 MatchQueryBuilder match = QueryBuilders.matchQuery("name", "陈"); System.out.println(match); SearchResponse books = search .setTypes("books") .setQuery(match)//指定查询器 .get(); System.out.println(books.toString());
我们通过打印可以看到match_all其向服务器发送的json 如下:
{ "match" : { "name" : { "query" : "陈", "operator" : "OR", "prefix_length" : 0, "max_expansions" : 50, "fuzzy_transpositions" : true, "lenient" : false, "zero_terms_query" : "NONE", "boost" : 1.0 } } }
(3). (phrase)习语匹配 按短语查询,只有存在这个短语的文档才会被显示出来。
//预查询指定索引 SearchRequestBuilder search = client.prepareSearch("book"); //构建一个匹配指定字段的选择器 name 字段(field) 内容是陈 MatchPhraseQueryBuilder phrase = QueryBuilders.matchPhraseQuery("name", "c陈"); System.out.println(phrase); SearchResponse books = search .setTypes("books") .setQuery(phrase)//指定查询器 .get(); System.out.println(books.toString());
我们通过打印可以看到match_all其向服务器发送的json 如下:
{ "match_phrase" : { "name" : { "query" : "c陈", "slop" : 0, "boost" : 1.0 } } }
(4). (multiMatch)多字段模糊匹配查询
//预查询指定索引 SearchRequestBuilder search = client.prepareSearch("book"); //构建一个多字段模糊匹配multiMatchQuery MultiMatchQueryBuilder multi = QueryBuilders.multiMatchQuery("c陈好", "name", "author"); System.out.println(multi); SearchResponse books = search .setTypes("books") .setQuery(multi)//指定查询器 .get(); System.out.println(books.toString()); //client.prepareDelete("book","books","AWwO0p5geq2bqnybBzqr").get();
我们通过打印可以看到match_all其向服务器发送的json 如下:
{ "multi_match" : { "query" : "c陈好", "fields" : [ "author^1.0", "name^1.0" ], "type" : "best_fields", "operator" : "OR", "slop" : 0, "prefix_length" : 0, "max_expansions" : 50, "lenient" : false, "zero_terms_query" : "NONE", "boost" : 1.0 } }
(5). (term 查询)结构化查询,term是将传入的文本原封不动地(不分词)拿去查询。
//预查询指定索引 SearchRequestBuilder search = client.prepareSearch("book"); //构建一个term 查询 TermQueryBuilder term = QueryBuilders.termQuery("id", 1); System.out.println(term); SearchResponse books = search .setTypes("books") .setQuery(term)//指定查询器 .get(); System.out.println(books.toString());
我们通过打印可以看到match_all其向服务器发送的json 如下:
{ "term" : { "id" : { "value" : 1, "boost" : 1.0 } } }
(6) 复合查询,多种条件的集合
布尔查询:
SearchRequestBuilder search =client.prepareSearch("book"); //bool 查询 BoolQueryBuilder bool = QueryBuilders.boolQuery(); //筛选 bool.must(QueryBuilders.multiMatchQuery("c","author","name")); bool.must(QueryBuilders.matchQuery("date",1563640592899l)); //过滤 bool.filter(QueryBuilders.termQuery("date","156364059289")); System.out.println(bool); SearchResponse books = search .setTypes("books") .setQuery(bool)//指定查询器 .get(); System.out.println(books.toString());
打印发送的json 如下:
{ "bool" : { "must" : [ { "multi_match" : { "query" : "c", "fields" : [ "author^1.0", "name^1.0" ], "type" : "best_fields", "operator" : "OR", "slop" : 0, "prefix_length" : 0, "max_expansions" : 50, "lenient" : false, "zero_terms_query" : "NONE", "boost" : 1.0 } }, { "match" : { "date" : { "query" : 1563640592899, "operator" : "OR", "prefix_length" : 0, "max_expansions" : 50, "fuzzy_transpositions" : true, "lenient" : false, "zero_terms_query" : "NONE", "boost" : 1.0 } } } ], "filter" : [ { "term" : { "date" : { "value" : "156364059289", "boost" : 1.0 } } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } }