小编在这里先介绍一下,Elastic Search高级操作分为:批量操作、导入数据、ES的各种那个查询、索引别名和重建索引,下面的各种操作小编都会介绍两种操作方式,里面有的可能会介绍不对,请各位及时在评论区提出意见,这也是小编的学习笔记,拿出来与各位分享,话不多说,开始正式的内容
首先先看下goods表的结构及数据
按数据库结构,创建索引
索引创建完毕,添加文档,导入数据
在之前的maven工程下先导入mybatis、fastjson的依赖。
然后配置application相关的mybatis数据源配置。
在application扫描了mybatis的domain文件夹。然后我们创建实体,映射数据库表结构信息。
由于spec在数据库是varchar类型,将来要存储成json形式的数据格式,所以我们将sepc的数据类型设置为map。然后再设置一个为string类型的specStr字段,作为接收数据库的信息。
对应生成,get、set、toString方法,用Lombok插件也可以。
创建mapper接口,和resource下对应的mapper文件夹及GoodMapper.xml
Mapper的初始化示例如下:
测试下:
在之前的测试类中,@Autowrid一下goodsMapper,然后执行如下:
去kibana里查询一下,发现specStr我们没有用处,我们可以在实体类里给specStr加个注解,这样他就不会加入到ES中。
//查询出来默认是10条
GET goods/_search
{
“query”:{
“match_all”: {}
}
}
若想查询全部数据,算上分页,如下:
右侧Took参数代表时间,它是有缓存的越查询越快,timeout是超时秒,_shards是分片信息,hits是命中,命中多少数据,max_score得分,得分越高就越排在前面。后续根据得分进行排序。
查询有多少条记录
继续写获取具体的数据
由于是默认显示10条,我们要按分页查,或者查一条多少条,我们改下上面的query查询条件。
这样就查出100条数据。
跟之前唯一的求别就是QueryBuilder的查询方法变成.termQuery
跟之前唯一的求别就是QueryBuilder的查询方法变成.matchQuery,默认是or查询
那怎么指定and查询呢,可以使用MatchQueryBuilder代码如下:
使用通配符wildcard来进行查询,华、华、华?等。。。,若写?华、华这种前面加通配符,他的效率不会很高。
使用正则regexp来进行查询,它的性能是根据正则的性能来确定的,性能也不是很高
使用前缀prefix来进行查询,他对keyword的类型支持比较好,对text不太好。
通配符查询WiljdcardQueryBuilder
正则查询RegexQueryBuilder
前缀查询PrefixQueryBuilder
Range查询
查处结果后,再加上排序,asc从小到大,desc从大到小
多字段同时查询,queryString是一种多字段查询方式。他跟match的区别是它可以多字段。
默认就是分词,输入华为手机,他就分为华为、手机,等同于 华为 OR 手机。
我们还可以查华为 and 手机
还要介绍下simple_query_string它不支持 OR和AND,如果你写 华为 AND 手机,他会默认这是三个词。
指标聚合案例:查询名称是华为的最贵是多少钱?
桶聚合案例:将手机的品牌名称分组
terms是对应分组的操作
查不是最难的,最难的是获取数据,因为要获取分组后的数据
下面操作桶聚合
执行一下
黑马程序员这个字,就是高亮
首先要确认哪个字段是要做高亮,然后前缀加什么,后缀加什么。
若不设置前后缀,默认就是em标签
我们要将highlight中的信息,替换到titile中这样高亮的标签就会在界面回显
高亮设置完下面我们开始替换,下面的数据,遍历hit。
查询一下
ES不允许修改索引,但是我们业务需要改,ES又不让我们改,我们就用到了重建索引。重建一个新的索引,将原有索引的数据导入到新的索引中。
新建一个索引
添加文档
查询一下数据
由于现在birthday的字段是date类型,我们之前存的 1999-11-11是能保存的,但是现在存1999年11月11日,就无法保存了,报错如下,解析不了字符串。
现在需要改变birthday的字段类型,为text,若直接改原索引的类型由date改为text是不可以的,因为ES不支持,报错如下。
创建新的索引,将数据拷贝到新的索引中
再查询一下
这样就完成了索引的重建操作,但是会有个问题,在java中操作es还是使用老的索引,那么如何解决?
第一种:改代码(不推荐)
第二种:索引别名(推荐)
那么第二种具体操作步骤如下:
0、删除老版本的索引库
1、给新的索引起个别名是老的索引名