elasticsearch(新手村教程)
第一次接触学习elasticsearch,学习过程中遇到了很多的问题,在此和大家分享我初次使用elasticsearch的一些心得和遇到的坑。
(一)elasticsearch
1 windows安装 elasticsearch(我这里就只介绍windows的了)
直接在elasticsearch官网下载对应的版本 https://www.elastic.co/downloads/elasticsearch, 下载完成直接解压到对应的文件夹,直接双击elasticsearch.bat,启动,浏览器输入localhost:9200,显示如下(如果想通过ip:9200访问,则需要修改config/elasticsearch.yml文件里面的network.host: 0.0.0.0)
至此,虽然安装完成了elasticsearch,但是大家应该都觉得好像和没安装一样,这里就像是之前安装mysql一样,这里,我们需要借助插件来使用elasticsearch
(二)kibana
Kibana允许您可视化您的Elasticsearch数据并导航弹性堆栈,在这里安装kibana的作用之一是新版本的kibana的可视化界面,有dev tools可以当做脚本直接操作elasticsearch,不需要我们下载其他插件进行操作
进入官网 https://www.elastic.co/downloads/kibana 下载kibana,注意和elasticsearch版本对应,下载完成,解压到对应的文件夹,修改config/kibana.yml配置文件,server.port: 5601,server.host: “0.0.0.0”,然后进入bin里面启动kibana.bat,启动成功后直接进入http://localhost:5601,可以看到可视化界面
左侧导航栏有一个Dev Tools按钮,点击即可进行操作elasticsearch
我这里进行了一个简单的查询一个索引的所有数据
(三)elasticsearch的基本语法
这里大家可以通过 https://blog.csdn.net/mj86534210/article/details/79910909 去学习elasticsearch的基本语法,
首先我们需要在elasticsearch里面创建一个索引(类似于数据库创建一张表)
这里是在上面的Dev Tools里面直接操作:
POST /good/product
{
“settings”:{
“number_of_shards”:5,
“number_of_replicas”:1
},
“mappings”:{
“TypeName”:{
“dynamic”:“strict”,
“properties”:{
“id”:{“type”:“string”,“store”:“yes”,“index”:“not_analyzed”},
“name”:{“type”:“string”,“store”:“yes”,“index”:“analyzed”,“analyzer”: “ik_max_word”,“search_analyzer”: “ik_max_word”},
“price”:{“type”:“string”,“store”:“yes”,“index”:“analyzed”,“analyzer”: “ik_max_word”,“search_analyzer”: “ik_max_word”},
“count”:{“type”:“string”,“store”:“yes”,“index”:“analyzed”,“analyzer”: “ik_max_word”,“search_analyzer”: “ik_max_word”},
“createTime”:{“type”:“string”,“store”:“yes”,“index”:“analyzed”,“analyzer”: “ik_max_word”,“search_analyzer”: “ik_max_word”},
“delFlag”:{“type”:“string”,“store”:“yes”,“index”:“not_analyzed”}
}
}
}
}
properties表示表的字段
type字段类型,这里的字段都设置成了string,是因为在查询和编码过程中,有些类型不能很好的被转换,例如boolean
store是否存储,属性有yes或者no,无论那种属性都会被存储,但如果设置成no,在查询的时候是无法用此属性作为查询项的,基于拓展和业务方便维护,建议使用yes
index是否索引,属性有not_analyzed(分词不分析)、analyzed(分词分析)、no(不分析不分词)
analyzer使用哪种分词器,在安装es的时候会自己安装分词器,例如IK分词器,在此指定分词的时候使用的是哪种分词器
search_analyzer使用哪种分词器,但不是在入库的时候,而是在做查询的时候使用哪种分词器
ignore_above对超过 ignore_above 的字符串,analyzer 不会进行处理;所以就不会索引起来。导致的结果就是最终搜索引擎搜索不到了。这个选项主要对 not_analyzed 字段有用,这些字段通常用来进行过滤、聚合和排序。而且这些字段都是结构化的,所以一般不会允许在这些字段中索引过长的项。
format日期格式要求,例如设置为"yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
dynamic表示是否使用动态映射,属性有
true默认值,动态添加字段
false忽略新字段
strict如果碰到陌生字段,抛出异常
settings表示设置(这里了解一下就行)
num_of_shards设置分片数量,默认为5
num_of_replicas设置副本数量,默认为1
这里已经创建了一个简单的索引,index=good ;type=product
删除索引:DELETE /good 可以直接删除对应的索引
或者 DELETE /_all 、DELETE /*删除所有索引
这里可以直接往索引里面新增几条数据了
PUT /good/product/1
{
“id”: “123456”,
“name”: “牛肉”,
“price”: “65”,
“count”: “1”,
“createTime”: “2018-10-16 16:56”,
“delFlag”: “0”
}
PUT /good/product/2
{
“id”: “123457”,
“name”: “牛腩”,
“price”: “45”,
“count”: “1”,
“createTime”: “2018-10-16 16:56”,
“delFlag”: “0”
}
如果是修改的话需要把所有的属性都写上,不然修改之后就只剩修改的数据了
一般执行成功都是比较友好的提示,一般如果你操作错误,执行的时候会报异常,看着异常去修改就好了
(四)java项目整合elasticsearch
这里附上源码,大家可以下载查看链接: https://pan.baidu.com/s/1yrq4Q_otBvL3exY6UKH61w 提取码: gqpm
(五)logstach以及同步mysql的插件Logstash-input-jdbc
1 直接在elasticsearch官网下载对应的win的版本,注意个之前下载的elasticsearch的版本一致,解压之后输入如下命令可以测试是否安装成功,进到bin目录下运行:./logstash -e ‘input { stdin { } } output { stdout {} }’
然后等待数秒,可以输入任意字符,即可看到对应的输出
2 安装logstach-input-jdbc插件
下面安装该插件的时候会用到一个网址 https://gems.ruby-china.com/ 这个是目前可以使用的一个网址,下面地址里的网址记得换成这个,不然会报错。
详细参照 https://blog.csdn.net/u011781521/article/details/77856331?utm_source=tuicool&utm_medium=referral
不过这里要注意几个坑,
1,需要修改Gemfile文件里面的内容
2 ,上面链接里面提到的那个https://rubygems.org/ 已经失效了,现在已经换成了 https://gems.ruby-china.com/
3 ,安装好logstach-input-jdbc插件之后,需要注意的是jdbc.conf里面output的配置
index对应的就是索引的名字,document_type对应的是type,
前面还会出现的input里面的type,主要用于多表更新使用
4 记得使用管理员身份运行
至此,输入命令启动logstach就行,如果成功则出现如下所示
出现共色标志的地方,就相当于已经成功了,这个时候,只需要对数据库进行对应的操作,然后再去elasticsearch里面查看,就可以看到结果了,如果这里运行报错,可以打开logs里面查看日志,一般这里会出错,则是昂刚才配置的jdbc.conf和jdbc.sql配置错误,仔细查看,修改即可。
(六) 在项目中使用elasticsearchTemplate(这里主要是多条件查询)
前台最容易碰到的一种情况就是进行多条件筛选查询,如果只是用mybatis来实现,很简单。但是这里要用elasticsearch来实现,估计第一次使用的小伙伴还是有点懵。
我这里主要是使用elasticsearchTemplate来实现对elasticsearch立面的数据进行查询,
如果只是单纯的单条见的查询,如下
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(
termQuery("name", name)
)
.build();
return elasticsearchTemplate.queryForList(searchQuery, Product.class);
多条件查询,这里可以把BoolQueryBuilder 当成StringBuffer,将需要用到的条件进行拼接,这样就可以实现多条件查询了。
TermQueryBuilder termQueryBuilder1=null;
//new 一个BoolQueryBuilder,类似于StringBuffer,然后判断是否为空,将条件拼接
BoolQueryBuilder boolQueryBuilder=new BoolQueryBuilder();
if (tmallLess.getShopType()!=null){
//termQuery是完全匹配,
termQueryBuilder1=termQuery("shopType", tmallLess.getShopType());
boolQueryBuilder.must(termQueryBuilder1);
}
if (tmallLess.getStartNum()!=null){
//filter是过滤,rangeQuery是过滤的条件
boolQueryBuilder.filter(rangeQuery("shopPrice").gte(tmallLess.getStartNum()));
}
if (tmallLess.getEndNum()!=null){
boolQueryBuilder.filter(rangeQuery("shopPrice").lte(tmallLess.getEndNum()));
}
if (!StringUtils.isEmpty(tmallLess.getShopName())){
//模糊查询
boolQueryBuilder.must(matchQuery("shopName",tmallLess.getShopName()));
}
//将拼接的条件直接放入查询
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder);
//将上面的查询结果进行排序
if (StringUtils.equals(tmallLess.getShopPriceOrder(),"1")){
//按指定字段升序排序
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("shopPrice").order(SortOrder.ASC));
}else if (StringUtils.equals(tmallLess.getShopPriceOrder(),"2")){
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("shopPrice").order(SortOrder.DESC));
}
//设置分页,因为前面的查询结果默认只显示10条
Pageable pageable = new PageRequest(pageNum, pageSize);
//得到的最终的结果进行build创建一个query语句
SearchQuery searchQuery=nativeSearchQueryBuilder.withPageable(pageable).build();
return elasticsearchTemplate.queryForList(searchQuery, EsTmallShop.class);
时间有限,暂时只是学习到这里,有可能还有一些地方有问题,有一些地方还没写到,之后会慢慢改进,暂时这里只是作为使用elasticsearch同步数据库,有疑问可以相互交流,有错误之处可以指出。
参考:
https://blog.csdn.net/u011781521/article/details/77856331?utm_source=tuicool&utm_medium=referral
https://blog.csdn.net/mj86534210/article/details/79910909