1、安装elastic search
dokcer中安装elastic search
(1)下载ealastic search和kibana
(2)配置
(3)启动Elastic search
设置开机启动elasticsearch
(4)启动kibana:
设置开机启动kibana
(5)测试
查看elasticsearch版本信息: http://#:9200/
显示elasticsearch 节点信息http://#:9200/_cat/nodes ,
访问Kibana: http://#:5601/app/kibana
2、初步检索
1)_CAT
(1)GET/cat/nodes:查看所有节点
如:http://#:9200/_cat/nodes :
注:*表示集群中的主节点
(2)GET/cat/health:查看es健康状况
如: http://#:9200/_cat/health
注:green表示健康值正常
(3)GET/cat/master:查看主节点
如: http://#:9200/_cat/master
(4)GET/_cat/indicies:查看所有索引 ,等价于mysql数据库的show databases;
如: http://#:9200/_cat/indices
2)索引一个文档
保存一个数据,保存在哪个索引的哪个类型下,指定用那个唯一标识
PUT customer/external/1;在customer索引下的external类型下保存1号数据为
PUT和POST都可以
POST新增。如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号;
PUT可以新增也可以修改。PUT必须指定id;由于PUT需要指定id,我们一般用来做修改操作,不指定id会报错。
创建数据成功后,显示201 created表示插入记录成功。
这些返回的JSON串的含义;这些带有下划线开头的,称为元数据,反映了当前的基本信息。
“_index”: “customer” 表明该数据在哪个数据库下;
“_type”: “external” 表明该数据在哪个类型下;
“_id”: “1” 表明被保存数据的id;
“_version”: 1, 被保存数据的版本
“result”: “created” 这里是创建了一条数据,如果重新put一条数据,则该状态会变为updated,并且版本号也会发生变化。
下面选用POST方式:
http://#:9200/customer/external/1
通过“if_seq_no=1&if_primary_term=1 ”,当序列号匹配的时候,才进行修改,否则不修改。
实例:将id=1的数据更新为name=1,然后再次更新为name=2,起始_seq_no=6,_primary_term=1
(1)将name更新为1
(3)查询新的数据
http://#:9200/customer/external/1
能够看到_seq_no变为7。
(4)再次更新,更新成功
(1)POST更新文档,带有_update
http://#:9200/customer/external/1/_update
如果再次执行更新,则不执行任何操作,序列号也不发生变化
POST更新方式,会对比原来的数据,和原来的相同,则不执行任何操作(version和_seq_no)都不变。
(2)POST更新文档,不带_update
在更新过程中,重复执行更新操作,数据也能够更新成功,不会和原来的数据进行对比。
5)删除文档或索引
注:elasticsearch并没有提供删除类型的操作,只提供了删除索引和文档的操作。
删除前,所有的索引
删除“ customer ”索引
删除后,所有的索引
6)eleasticsearch的批量操作——bulk
语法格式:
这里的批量操作,当发生某一条执行发生失败时,其他的数据仍然能够接着执行,也就是说彼此之间是独立的。
bulk api以此按顺序执行所有的action(动作)。如果一个单个的动作因任何原因失败,它将继续处理它后面剩余的动作。当bulk api返回时,它将提供每个动作的状态(与发送的顺序相同),所以您可以检查是否一个指定的动作是否失败了。
实例1: 执行多条数据
执行结果
实例2:对于整个索引执行批量操作
运行结果:
7)样本测试数据
准备了一份顾客银行账户信息的虚构的JSON文档样本。每个文档都有下列的schema(模式)。
https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json ,导入测试数据,
POST bank/account/_bulk
3、检索
1)search Api
ES支持两种基本方式检索;
- 通过REST request uri 发送搜索参数 (uri +检索参数);
- 通过REST request body 来发送它们(uri+请求体);
信息检索
uri+请求体进行检索
HTTP客户端工具(),get请求不能够携带请求体,
返回结果:
(1)只有6条数据,这是因为存在分页查询;
使用和可以指定查询
(2)详细的字段信息,参照: https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-search.html
The response also provides the following information about the search request:
- – how long it took Elasticsearch to run the query, in milliseconds
- – whether or not the search request timed out
- – how many shards were searched and a breakdown of how many shards succeeded, failed, or were skipped.
- – the score of the most relevant document found
- - how many matching documents were found
- - the document’s sort position (when not sorting by relevance score)
- - the document’s relevance score (not applicable when using )
2)Query DSL
(1)基本语法格式
Elasticsearch提供了一个可以执行查询的Json风格的DSL。这个被称为Query DSL,该查询语言非常全面。
一个查询语句的典型结构
如果针对于某个字段,那么它的结构如下:
query定义如何查询;
- match_all查询类型【代表查询所有的所有】,es中可以在query中组合非常多的查询类型完成复杂查询;
- 除了query参数之外,我们可也传递其他的参数以改变查询结果,如sort,size;
- from+size限定,完成分页功能;
- sort排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准;
(2)返回部分字段
查询结果:
(3)match匹配查询
- 基本类型(非字符串),精确控制
match返回account_number=20的数据。
查询结果:
- 字符串,全文检索
全文检索,最终会按照评分进行排序,会对检索条件进行分词匹配。
查询结果:
(4) match_phrase [短句匹配]
将需要匹配的值当成一整个单词(不分词)进行检索
查处address中包含mill_road的所有记录,并给出相关性得分
查看结果:
match_phrase和Match的区别,观察如下实例:
查询结果:
使用match的keyword
查询结果,一条也未匹配到
修改匹配条件为“990 Mill Road”
查询出一条数据
文本字段的匹配,使用keyword,匹配的条件就是要显示字段的全部值,要进行精确匹配的。
match_phrase是做短语匹配,只要文本中包含匹配条件,就能匹配到。
(5)multi_math【多字段匹配】
state或者address中包含mill,并且在查询过程中,会对于查询条件进行分词。
查询结果:
(6)bool用来做复合查询
复合语句可以合并,任何其他查询语句,包括符合语句。这也就意味着,复合语句之间
可以互相嵌套,可以表达非常复杂的逻辑。
must:必须达到must所列举的所有条件
must_not,必须不匹配must_not所列举的所有条件。
should,应该满足should所列举的条件。
实例:查询gender=m,并且address=mill的数据
查询结果:
must_not:必须不是指定的情况
实例:查询gender=m,并且address=mill的数据,但是age不等于38的
查询结果: