Elastic Search高级操作

client high java 如何往es中写数据 java es操作_数据


小编在这里先介绍一下,Elastic Search高级操作分为:批量操作、导入数据、ES的各种那个查询、索引别名和重建索引,下面的各种操作小编都会介绍两种操作方式,里面有的可能会介绍不对,请各位及时在评论区提出意见,这也是小编的学习笔记,拿出来与各位分享,话不多说,开始正式的内容

client high java 如何往es中写数据 java es操作_数据_02

批量操作

批量操作-脚本

client high java 如何往es中写数据 java es操作_数据_03


client high java 如何往es中写数据 java es操作_JAVA_04


Json必须一行,换行不支持操作。

client high java 如何往es中写数据 java es操作_JAVA_05


操作,每个成功与否不会干预其他,都会执行。看status码

client high java 如何往es中写数据 java es操作_经验分享_06

批量操作-JAVA

client high java 如何往es中写数据 java es操作_JAVA_07


client high java 如何往es中写数据 java es操作_经验分享_08

导入数据

client high java 如何往es中写数据 java es操作_JAVA_09


client high java 如何往es中写数据 java es操作_elasticsearch_10


首先先看下goods表的结构及数据

client high java 如何往es中写数据 java es操作_JAVA_11


client high java 如何往es中写数据 java es操作_高亮_12


client high java 如何往es中写数据 java es操作_JAVA_13


按数据库结构,创建索引

client high java 如何往es中写数据 java es操作_数据_14


索引创建完毕,添加文档,导入数据

client high java 如何往es中写数据 java es操作_elasticsearch_15

导入数据的java操作方式

在之前的maven工程下先导入mybatis、fastjson的依赖。

client high java 如何往es中写数据 java es操作_elasticsearch_16


然后配置application相关的mybatis数据源配置。

client high java 如何往es中写数据 java es操作_JAVA_17


在application扫描了mybatis的domain文件夹。然后我们创建实体,映射数据库表结构信息。
由于spec在数据库是varchar类型,将来要存储成json形式的数据格式,所以我们将sepc的数据类型设置为map。然后再设置一个为string类型的specStr字段,作为接收数据库的信息。

client high java 如何往es中写数据 java es操作_JAVA_18


对应生成,get、set、toString方法,用Lombok插件也可以。
创建mapper接口,和resource下对应的mapper文件夹及GoodMapper.xml

client high java 如何往es中写数据 java es操作_JAVA_19


Mapper的初始化示例如下:

client high java 如何往es中写数据 java es操作_elasticsearch_20


client high java 如何往es中写数据 java es操作_数据_21


测试下:
在之前的测试类中,@Autowrid一下goodsMapper,然后执行如下:

client high java 如何往es中写数据 java es操作_经验分享_22


client high java 如何往es中写数据 java es操作_高亮_23


去kibana里查询一下,发现specStr我们没有用处,我们可以在实体类里给specStr加个注解,这样他就不会加入到ES中。

client high java 如何往es中写数据 java es操作_JAVA_24

ES的各种查询(重点)

matchAll查询-脚本

//查询出来默认是10条
GET goods/_search
{
	“query”:{
		“match_all”: {}
	}
}

client high java 如何往es中写数据 java es操作_elasticsearch_25


若想查询全部数据,算上分页,如下:

client high java 如何往es中写数据 java es操作_数据_26


右侧Took参数代表时间,它是有缓存的越查询越快,timeout是超时秒,_shards是分片信息,hits是命中,命中多少数据,max_score得分,得分越高就越排在前面。后续根据得分进行排序。

matchAll查询-JAVA

查询有多少条记录

client high java 如何往es中写数据 java es操作_高亮_27


继续写获取具体的数据

client high java 如何往es中写数据 java es操作_elasticsearch_28

client high java 如何往es中写数据 java es操作_数据_29


client high java 如何往es中写数据 java es操作_elasticsearch_30


由于是默认显示10条,我们要按分页查,或者查一条多少条,我们改下上面的query查询条件。

client high java 如何往es中写数据 java es操作_高亮_31


这样就查出100条数据。

term查询-脚本

client high java 如何往es中写数据 java es操作_高亮_32


client high java 如何往es中写数据 java es操作_经验分享_33

term查询-JAVA

跟之前唯一的求别就是QueryBuilder的查询方法变成.termQuery

client high java 如何往es中写数据 java es操作_数据_34

match查询-脚本

or是分别查,然后取并集,and是同时符合的数据

client high java 如何往es中写数据 java es操作_经验分享_35


client high java 如何往es中写数据 java es操作_elasticsearch_36

match查询-JAVA

跟之前唯一的求别就是QueryBuilder的查询方法变成.matchQuery,默认是or查询

client high java 如何往es中写数据 java es操作_JAVA_37


那怎么指定and查询呢,可以使用MatchQueryBuilder代码如下:

client high java 如何往es中写数据 java es操作_高亮_38

模糊查询-脚本

client high java 如何往es中写数据 java es操作_高亮_39


client high java 如何往es中写数据 java es操作_elasticsearch_40


使用通配符wildcard来进行查询,华、华、华?等。。。,若写?华、华这种前面加通配符,他的效率不会很高。

client high java 如何往es中写数据 java es操作_经验分享_41


使用正则regexp来进行查询,它的性能是根据正则的性能来确定的,性能也不是很高

client high java 如何往es中写数据 java es操作_经验分享_42


使用前缀prefix来进行查询,他对keyword的类型支持比较好,对text不太好。

client high java 如何往es中写数据 java es操作_elasticsearch_43

模糊查询-JAVA

通配符查询WiljdcardQueryBuilder

client high java 如何往es中写数据 java es操作_经验分享_44


正则查询RegexQueryBuilder

client high java 如何往es中写数据 java es操作_经验分享_45


前缀查询PrefixQueryBuilder

client high java 如何往es中写数据 java es操作_经验分享_46

范围查询-脚本

Range查询

client high java 如何往es中写数据 java es操作_经验分享_47


查处结果后,再加上排序,asc从小到大,desc从大到小

client high java 如何往es中写数据 java es操作_经验分享_48

范围查询-JAVA

client high java 如何往es中写数据 java es操作_经验分享_49


查处结果后,再加上排序,asc从小到大,desc从大到小

client high java 如何往es中写数据 java es操作_高亮_50

queryString查询-脚本

多字段同时查询,queryString是一种多字段查询方式。他跟match的区别是它可以多字段。

client high java 如何往es中写数据 java es操作_经验分享_51


默认就是分词,输入华为手机,他就分为华为、手机,等同于 华为 OR 手机。

client high java 如何往es中写数据 java es操作_数据_52


我们还可以查华为 and 手机

client high java 如何往es中写数据 java es操作_经验分享_53


还要介绍下simple_query_string它不支持 OR和AND,如果你写 华为 AND 手机,他会默认这是三个词。

client high java 如何往es中写数据 java es操作_elasticsearch_54

queryString查询-JAVA

QueryStringQueryBuilder

client high java 如何往es中写数据 java es操作_JAVA_55

布尔查询-脚本(重点)

client high java 如何往es中写数据 java es操作_高亮_56


client high java 如何往es中写数据 java es操作_数据_57


client high java 如何往es中写数据 java es操作_经验分享_58

聚合查询-脚本

client high java 如何往es中写数据 java es操作_elasticsearch_59


指标聚合案例:查询名称是华为的最贵是多少钱?

client high java 如何往es中写数据 java es操作_数据_60


桶聚合案例:将手机的品牌名称分组
terms是对应分组的操作

client high java 如何往es中写数据 java es操作_数据_61

聚合查询-JAVA

查不是最难的,最难的是获取数据,因为要获取分组后的数据
下面操作桶聚合

client high java 如何往es中写数据 java es操作_数据_62


client high java 如何往es中写数据 java es操作_JAVA_63


client high java 如何往es中写数据 java es操作_高亮_64


执行一下

client high java 如何往es中写数据 java es操作_elasticsearch_65

高亮查询-脚本

黑马程序员这个字,就是高亮

client high java 如何往es中写数据 java es操作_经验分享_66


首先要确认哪个字段是要做高亮,然后前缀加什么,后缀加什么。

client high java 如何往es中写数据 java es操作_经验分享_67


若不设置前后缀,默认就是em标签

client high java 如何往es中写数据 java es操作_高亮_68

高亮查询-JAVA

我们要将highlight中的信息,替换到titile中这样高亮的标签就会在界面回显

client high java 如何往es中写数据 java es操作_JAVA_69


高亮设置完下面我们开始替换,下面的数据,遍历hit。

client high java 如何往es中写数据 java es操作_JAVA_70


查询一下

client high java 如何往es中写数据 java es操作_经验分享_71

索引别名和重建索引

重建索引

ES不允许修改索引,但是我们业务需要改,ES又不让我们改,我们就用到了重建索引。重建一个新的索引,将原有索引的数据导入到新的索引中。

client high java 如何往es中写数据 java es操作_JAVA_72

重建索引操作-脚本

新建一个索引

client high java 如何往es中写数据 java es操作_JAVA_73


添加文档

client high java 如何往es中写数据 java es操作_数据_74


查询一下数据

client high java 如何往es中写数据 java es操作_高亮_75


由于现在birthday的字段是date类型,我们之前存的 1999-11-11是能保存的,但是现在存1999年11月11日,就无法保存了,报错如下,解析不了字符串。

client high java 如何往es中写数据 java es操作_JAVA_76


现在需要改变birthday的字段类型,为text,若直接改原索引的类型由date改为text是不可以的,因为ES不支持,报错如下。

client high java 如何往es中写数据 java es操作_数据_77


创建新的索引,将数据拷贝到新的索引中

client high java 如何往es中写数据 java es操作_JAVA_78


client high java 如何往es中写数据 java es操作_JAVA_79


再查询一下

client high java 如何往es中写数据 java es操作_JAVA_80


这样就完成了索引的重建操作,但是会有个问题,在java中操作es还是使用老的索引,那么如何解决?
第一种:改代码(不推荐)
第二种:索引别名(推荐)

那么第二种具体操作步骤如下:
0、删除老版本的索引库
1、给新的索引起个别名是老的索引名

直接别名老索引会报错

client high java 如何往es中写数据 java es操作_数据_81


那么删除老索引,用新老索引名都能查到。

client high java 如何往es中写数据 java es操作_数据_82


课程到这里就结束了,大家一起实践操作吧!!!