注意:elasticsearch的版本必须和kibana的版本是相同的。
特别注意:
-e ES_JAVA_OPTS=“-Xms64m -Xmx128m” \ 测试环境下,设置ES的初始内存和最大内存,否则导致过大启动不了ES;
由于我们使用的是docker容器,所以使用 docker logs elasticsearch这个命令打印出elasticsearch的日志消息。
使用 chmod -R 777 /mydata/elasticsearch/ 改变config、data、plugins文件夹的权限。
localhost:9200/_cat/nodes:查看ES下的全部节点
查询到的结果: 127.0.0.1 28 84 11 dilmrt * WIN-NQTK0V7R9FC “*”:在集群的环境下代表着主节点。保存一个数据,保存在哪个索引的那个类型下,指定用哪个唯一标识。
PUT customer/external/1;在customer 索引下的external 类型下保存 1号数据为:
PUT customer/external/1 { "name":"张三" } PUT和POST请求都可以。 POST 新增。如果不指定id,会自动生成id。指定id就会修改这个id的数据,并增加版本号。 PUT 可以新增可以修改。PUT必须指定id;由于PUT需要指定id,我们一般都用来做修改操作,不指定id会报错。查询文档是发送GET请求的 :
customer/external/1 结果: { "_index": "customer", //在哪个索引 (相当于MySQL中的 在哪个数据库中) "_type": "external", //在哪个类型 (相当于MySQL中的在哪个表中) "_id": "1", //记录id "_version": 2, //版本号 "_seq_no": 1, //并发控制字段,每一更新就会+1,用来做乐观锁 "_primary_term": 1, //同上,主分片重新分配,如重启,就会变化 "found": true, "_source": { "name": "张三" } } 更新携带: ?if_esq_no = 0&if_primary_term=1bulk API 以此按顺序执行所有的action(动作),如果一个单个的动作因任何原因失败,他将继续处理后面剩余的动作。当 bulk API 返回时,它将提供每一个动作的状态(与发送的顺序相同)。
准备了一份顾客银行账户的信息虚构的JSON文档样本,每个文档都有下列的 schema(模式):
{ "action_number":0, "balance":16623, "firstname":"Bradshwaw", "lastname":"Mckenzie", "age":29, "gender":"F", "addres":"244 Columbus Place", "employer":"Euron", "email":"bradshawmckenzie@euron.com", "city":"Hohucken", "state":"CO" }https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json
POST /bank/account/_bulk
测试数据
ES支持两种基本方式检索:
一个是通过使用 REST request URI 发送搜索参数(url+检索参数).另一个是通过使用 REST requset body来发送请求(url + 请求体 )一切检索从_search开始
GET bank/_search //检索bank下所有的信息,包括type和docs。 GET bank/_search?q=*&sort=account_number:asc //请求参数方式检索 响应的结果解释: took-Elasticsearch:执行搜索的时间(毫秒); time_out:告诉我们搜索是否超时; _shards:告诉我们多少个分片被搜索了,以及统计了成功/失败的搜索分析; hits:搜索结果; hits.total:搜索结果; hits.hits:实际的搜索结果数组(默认前10的文档); sort:结果的排序Key(键)(没有按照score排序); score 和 max_scoure:相关性得分和最高得分(全文检索用)uri+请求体进行检索
GET bank/_search { "query":{ //匹配规则 "match_all":{} }, "sort":[ //排序规则 { "account_number":{ "order":"desc" } } ], "from":10, "size":10 }ElasticSearch提供了一个可有执行查询的Json风格的DSL(domain-specific language 领域特定语言)。这个被称之为Query DSL。该查询语言非常的全面,并且刚开始的时候感觉有点复杂,真正学好它的方法是从一些基础的示例开始的。
一个查询语句 的典型结构
{ QUERY_NAME:{ ARGUMENT:VALUE, ARGUMENT:VALUE,.... } }如果是针对某个字段,那么它的结构如下:
{ QUERY_NAME:{ FIELD_NAME:{ ARGUMENT:VALUE, ARGUMENT:VALUE,.... } } } 1、query:定义如何查询; 2、match_all:查询类型[代表查询所有的所有],es中可以在query中组合非常多的查询类型完成复杂查询; 3、除了query参数之外,我们可以传递其他的参数以改变查询结果。如sort、size。 4、from+size限定,完成分页功能。 5、sort排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准。基本类型(非字符串),精确匹配
GET /bank/_search { "query": { "match": { //按照account_number等于10进行查询 "account_number": 10 } } }字符串,全文检索
GET /bank/_search { "query": { "match": { //匹配 state字段包含的CO值 "state": "CO" } } } //全文检索按照评分进行排序,会对检索条件进行分词匹配。将需要匹配的值当成一个整体单词(不分词)进行检索
#match_phrase【短语匹配】 GET /bank/_search { "query":{ "match_phrase": { "address": "Holmes Lane" } } } //查出的address中包含 holmes lane 的所有记录,并给出相关的得分bool用来做复合查询:
复合语句可以合并 任何 其他查询语句,包括复合语句,了解这点很重要。这意味着复合语句之间可以相互嵌套,可以表达非常复杂的逻辑。
must: 必须达到must列举的所有条件
#bool 复合查询 GET /bank/_search { "query": { "bool": { "must": [ {"match": {"address": "lane"}}, {"match": { "employer": "Pyrami" }} ], "must_not": [ {"match": { "age": "12" }} ], "should": [ {"match": { "lastname": "Wallace" }} ] } } } must:必须满足的条件; must_not:必须要不等于或者不满足; should:可以满足或者可以不满足;和 match 一样,匹配某个属性的值。全文检索字段用match,其他非text字段匹配用term。
#查询非文本字段的 GET /bank/_search { "query": { "term": { "balance": 28838 } } } //非文本字段的检索聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于SQL GROUP BY和 SQL聚合函数。在Elasticsearch中,有执行搜索返回hits(命中结果),并且同时返回聚合结果,把一个响应中的所有的hits(命中结果)分隔开的能力。这是非常强大且有效的,可以执行查询和多个聚合,并且再一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API来避免网络往返。
搜索 address中包含 mill 的所有人的年龄分布以及平均年龄,但不显示这些人的详情。
#检索出adders字段中带有mill的记录并且年龄分布以及平均年龄 GET /bank/_search { "query": { "match": { "address": "mill" } }, "aggs": { "ageAgg": { //聚合组名 "terms": { "field": "age", "size": 10 } } , "avg_age":{ "avg":{ "field": "account_number" } }, "balanceAge":{ "avg": { "field": "balance" } } } }常见的类型有
binary; boolean; Keywords; Numbers;日期时间类型
Dates:包括日期和时间对象和关系类型
object:JSON对象; flattend:整个Json对象作为单个字段值; nested:保留其子字段之间关系的Json对象; join:为同一索引中的文档定义父/子关系;结构化数据类型
Range:范围类型,例如long_range、double_range、date_range和ip_range; ip:IPv4和IPv6地址; murmur3:计算并存储值的散列汇总数据类型
histogram:预汇总的数值文本搜寻类型
text:分析的非结构化文本; annotated-text:包含特殊标记的文本。用于标识命名实体; completion:用于自动完成建议; search_as_you_type:text类似类型,用于按需输入完成; token_count:文本中的令牌计数文件等级类型
dense_vector 记录浮点值的密集向量。 rank_feature 记录数字功能以提高查询时的点击率。 rank_features 记录数字功能以提高查询时的点击率。空间数据类型
geo_point 纬度和经度点。 geo_shape 复杂的形状,例如多边形。 point 任意笛卡尔点。 shape 任意笛卡尔几何。其他种类
percolator 索引以查询DSL编写的查询。数组
在Elasticsearch中,数组不需要专用的字段数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值都必须具有相同的字段类型。请参阅数组。多领域
为不同的目的以不同的方式对同一字段建立索引通常很有用。例如,一个string字段可以映射为text用于全文搜索的字段,也可以映射为keyword用于排序或聚合的字段。或者,您可以使用standard分析仪, english分析仪和 french分析仪索引文本字段。Mapping(映射)
Mapping是用来定义一个文档(document),以及它所包含的属性(field)是如何存储的和索引的。比如:使用Mapping来定义。
哪些字符串属性应该被看做全文本属性(full text fields)。
哪些属性包含数字,日期或者地理位置。
文档中的所有属性是否都能被索引。
日期的格式。
自定义映射规则来执行动态添加属性。
查看mapping信息
#查看映射的信息 GET /bank/_mapping修改mapping信息
对于已经存在的映射字段,不能更新。更新必须创建新的索引进行数据迁移。
先创建出 new_twitter的正确映射。然后使用如下方式进行数据迁移。
POST reindex [固定写法] { "source":{ "index":"bank" }, "dest":{ "index":"new_bank" } }6.0版之前的迁移方式,需要考虑数据的类型
将旧索引的type下的数据进行迁移 POST _reindex { "source":{ "index":"bank", "type":"bank" }, "dest":{ //目标索引 "index":"new_bank" } }一个**tokenizer(分词器)**接收一个字符流,将之分割为独立的tokens(词元,通常是独立的单词),然后输出tokens流。
例如:whitespace tokenizer 遇到空包字符时分割文本。它会将文本“Quick brown fox”分割为“[Quick 、 brown、fox]”。
该tokenizer(分词器)还负责记录各个term的属性或position的位置,以及term(词条)所代表的原始word(单词)的start(起始)和end(结束)的character offsets(字符偏移量)。
修改 es文件下的plugins/ik/config文件中的IKAnalyzer.config.xml文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W3BovN4Y-1601993002370)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601817287328.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ohp3sZJT-1601993002375)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601817274400.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jROMHsox-1601993002377)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601817731683.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OKGGh7LW-1601993002381)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601817561958.png)]
由于es的使用版本必须对应,所以需要将SpringBoot整合es的版本改为使用的版本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aCHaGoEO-1601993002384)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601817677444.png)]
修改版本统一[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mi8b83us-1601993002386)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601857073184.png)]
用来操作9200端口
@Configuration public class ElasticSearchConfig { public static final RequestOptions COMMON_OPTIONS; /** * 将RequestOptions设置为单例模式,让所有的请求都来共享该实例 * 可以通过toBulider来设置请求头信息,可以带上自己的令牌 * 以及自定义响应的消费者 */ static { RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder(); COMMON_OPTIONS = builder.build(); } @Bean public RestHighLevelClient restHighLevelClient(){ RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"))); return client; } }