赞
踩
ES是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于RESTful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。
Lucene:Lucene本身就是一个搜索引擎的底层。
分布式:ES主要是为了突出他的横向扩展能力。
全文检索:将一段词语进行分词,并且将分出的单个词语统一的放到一个分词库中,在搜索时,根据关键字去分词库中检索,找到匹配的内容。(倒排索引)
RESTful风格的WEB接口:操作ES很简单,只需要发送一个HTTP请求,并且根据请求方式的不同,携带参数的同,执行相应的功能。
应用广泛:Github.com,WIKI,Gold Man用ES每天维护将近10TB的数据。
Solr在查询死数据时,速度相对ES更快一些。但是数据如果是实时改变的,Solr的查询速度会降低很多,ES的查询的效率基本没有变化。
Solr搭建基于需要依赖Zookeeper来帮助管理。ES本身就支持集群的搭建,不需要第三方的介入。
最开始Solr的社区可以说是非常火爆,针对国内的文档并不是很多。在ES出现之后,ES的社区火爆程度直线上升,ES的文档非常健全。
ES对现在云计算和大数据支持的特别好。
将存放的数据,以一定的方式进行分词,并且将分词的内容存放到一个单独的分词库中。
当用户去查询数据时,会将用户的查询关键字进行分词,然后去分词库中匹配内容,最终得到数据的id标识,根据id标识去存放数据的位置拉取到指定的数据。
官网下载:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
github下载:https://github.com/elastic/elasticsearch/tags
windows版本解压后,打开bin目录,双击elasticsearch.bat启动
Kibana主要是通过页面的方式来监控es,默认监控的ip是localhost,端口是9200,如果es的地址改变了,需要修改config文件夹中的kibana.yml配置文件,修改elasticsearch.url属性。
官网下载:https://www.elastic.co/cn/downloads/past-releases#kibana
github下载:https://github.com/elastic/kibana/tags
还是在刚刚的下载地址,下拉框选择kibana,版本还是选择6.5.4 windows版本下载解压后,打开bin目录,启动kibana.bat
在浏览器输入http://localhost:5601
Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到“存储库”中。这里主要用来将MySQL中的数据库导入到ES中。
官网下载:https://www.elastic.co/cn/downloads/past-releases#logstash
github下载:https://github.com/elastic/logstash/tags
还是在刚刚下载的网站,找到logstash,选择6.5.4版本,下载即可。
分词器:将搜索的关键词进行拆分
默认分词器Analyzer,对中文不友好
analyzer | logical name | description |
---|---|---|
standard analyzer | standard | standard tokenizer, standard filter, lower case filter, stop filter |
simple analyzer | simple | lower case tokenizer |
stop analyzer | stop | lower case tokenizer, stop filter |
keyword analyzer | keyword | 不分词,内容整体作为一个token(not_analyzed) |
pattern analyzer | whitespace | 正则表达式分词,默认匹配\W+ |
language analyzers | lang | 各种语言 |
snowball analyzer | snowball | standard tokenizer, standard filter, lower case filter, stop filter, snowball filter |
custom | custom | 至少需要指定一个 Tokenizer, 零个或多个Token Filter, 零个或多 |
下载IK分词器的地址:https://github.com/medcl/elasticsearch-analysis-ik/tags
windows版本:
将其解压放在ES的安装目录下的 /plugins/ik 目录下,重启es,分词器插件就自动加载了。
Linux版本:
进去到ES容器内部,跳转到bin目录下,执行bin目录下的脚本文件:
./elasticsearch-plugin install http://tomcat01.qfjava.cn:81/elasticsearch-analysis-ik-6.5.4.zip
重启ES的容器,让IK分词器生效。
注意:ik的中文分词器为:ik_max_word
一个索引下,可以创建多个类型。
Ps:根据版本不同,类型的创建也不同。
一个类型下,可以有多个文档。这个文档就类似于MySQL表中的多行数据。
属性 Field
一个文档中,可以包含多个属性。类似于MySQL表中的一行数据存在多个列。
GET请求:
POST请求:
PUT请求:
DELETE请求:
创建一个索引
PUT /person
{
"settings": {
"number_of_shards": 5
, "number_of_replicas": 1
}
}
查看索引信息
语法:
GET /person
管理页查看
删除索引
DELETE /person
字符串类型:
text
:被用于全文检索。 将当前Field进行分词。keyword
:当前Field不会被分词。数值类型:
long
:取值范围为-9223372036854774808~922337203685477480(-2的63次方到2的63次 方-1),占用8个字节integer
:取值范围为-2147483648~2147483647(-2的31次方到2的31次方-1),占用4个字节short
:取值范围为-32768~32767(-2的15次方到2的15次方-1),占用2个字节byte
:取值范围为-128~127(-2的7次方到2的7次方-1),占用1个字节double
:1.797693e+308~ 4.9000000e-324 (e+308表示是乘以10的308次方,e-324表示乘以10的负324次方)占用8个字节float
:3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,e-45表示乘以10的负45次方),占用4个字节half_float
:精度比float小一半。scaled_float
:根据一个long和scaled来表达一个浮点型,long-345,scaled-100 -> 3.45时间类型:
date
:针对时间类型指定具体的格式布尔类型:
boolean
:表达true和false二进制类型:
范围类型:
long_range
:赋值时,无需指定具体的内容,只需要存储一个范围即可,指定gt,lt, gte,lte integer_range:同上double_range
:同上float_range
:同上date_range
:同上ip_range
:同上经纬度类型:
geo_point
:用来存储经纬度的ip类型:
ip
:可以存储IPV4或者IPV6其他的数据类型参考官网: https://www.elastic.co/guide/en/elasticsearch/reference/6.5/mapping-types.html
语法如下:
# 创建索引 PUT /book { "settings": { # 主分片数 "number_of_shards": 5 # 备分片数 , "number_of_replicas": 1 }, # 指定数据结构 "mappings": { # 类型Type "novel":{ # 文档存储的field "properties":{ # Filed属性名 "name":{ # 类型 "type":"text", # 指定分词器 "analyzer":"ik_max_word", # 指定当前的Field可以被作为查询的条件 "index":true, # 是否需要额外存储 "store":false }, "author":{ "type":"keyword" }, "count":{ "type":"long" }, "on-sale":{ "type":"date", # 时间类型格式化方式 "format":"yyyy-MM-dd HH-mm-ss" }, "desc":{ "type":"text", "analyzer":"ik_max_word" } } } } }
文档在ES服务中的唯一标识, _index
, _type
, _id
三个内容为组合,锁定一个文档,操作是添加还是修改。
自动生成_id
POST /book/novel
{
"name":"盘龙",
"author":"我吃西红柿",
"count":10000,
"on-sale":"2000-01-01 00-00-00",
"desc":"山重水复疑无路,柳暗花明又一村!"
}
手动指定_id
# 添加文档,手动指定id
PUT /book/novel/1
{
"name":"红楼梦",
"author":"曹雪芹",
"count":100000,
"on-sale":"1935-01-01 00-00-00",
"desc":"一个是阆苑仙葩,一个是美玉无瑕"
}
覆盖式修改
PUT /book/novel/1
{
"name":"红楼梦",
"author":"曹雪芹",
"count":222222,
"on-sale":"1935-01-01 00-00-00",
"desc":"一个是阆苑仙葩,一个是美玉无瑕"
}
doc修改方式
#修改文档,基于doc方式
POST /book/novel/1/_update
{
"doc": {
# 指定需要修改的field和对应的值
"count":333333
}
}
根据id删除
DELETE /book/novel/id
1)、创建maven工程
2)、引入依赖
<!--elasticsearch--> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.5.4</version> </dependency> <!--elasticsearch高级API--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.5.4</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency>
3)、创建ES连接
public class ESClient {
//客户端连接对象
public static RestHighLevelClient getClient(){
//创建HttpHost对象,配置主机信息,ip和端口
HttpHost host = new HttpHost("localhost", 9200);
//创建RestClientBuilder客户端连接对象构造者
RestClientBuilder clientBuilder = RestClient.builder(host);
//创建RestHighLevelClient客户端连接对象
RestHighLevelClient client = new RestHighLevelClient(clientBuilder);
return client;
}
}
public class TestES { //获取客户端连接对象 RestHighLevelClient client = ESClient.getClient(); //索引名和类型 String index = "person"; String type = "man"; @Test public void createIndex() { //准备索引的setting Settings.Builder settings = Settings.builder() .put("number_of_shards", 5) .put("number_of_replicas", 1); //准备索引的mapping try { XContentBuilder mappings = JsonXContent.contentBuilder() .startObject()//mapping类型 .startObject("properties") .startObject("name") .field("type", "text") .endObject() .startObject("age") .field("type", "integer") .endObject() .startObject("birthday") .field("type", "date") .field("format", "yy-MM-dd") .endObject() .endObject() .endObject(); //将mapping和setting封装成request对象 CreateIndexRequest request = new CreateIndexRequest(index) .settings(settings) .mapping(type,mappings); //通过client对象去连接es并发送一个创建索引的请求执行创建索引 CreateIndexResponse resp = client.indices().create(request, RequestOptions.DEFAULT);//RequestOptions.DEFAULT默认请求选项 System.out.println("resp"+resp.toString()); } catch (IOException e) { e.printStackTrace(); } } }
//检查索引
@Test
public void existsIndex(){
//1、准备request对象
GetIndexRequest request = new GetIndexRequest();
request.indices(index);
//client查询
boolean exists = false;
try {
exists = client.indices().exists(request, RequestOptions.DEFAULT);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。