大鹏网站建设建设心理网站
news/
2025/10/4 3:51:00/
文章来源:
大鹏网站建设,建设心理网站,wordpress 菜单 字体,女生说wap是什么意思一、Elasticsearch 基础介绍
ElasticSearch 是分布式实时搜索、实时分析、实时存储引擎#xff0c;简称#xff08;ES)#xff0c; 成立于2012年#xff0c;是一家来自荷兰的、开源的大数据搜索、分析服务提供商#xff0c;为企业提供实时搜索、数据分析服务#xff0c;…一、Elasticsearch 基础介绍
ElasticSearch 是分布式实时搜索、实时分析、实时存储引擎简称ES) 成立于2012年是一家来自荷兰的、开源的大数据搜索、分析服务提供商为企业提供实时搜索、数据分析服务支持PB级的大数据。
基于Apache Lucene 开源搜索引擎Lucene是目前公认的性能最好最先进的功能最全的搜索引擎。
Elasticsearch使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能通过简单RESTfulAPI来隐藏Lucene的复杂性从而让全文搜索变得简单。 速度超出你的想像从10亿的数据中查出一条只需要1-2秒
除了Lucene 和全文搜索还有以下功能 分布式的实时文件存储每个字段都被索引并可被搜索 分布式的实时分析搜索引擎 可以扩展到上百台服务器处理PB级结构化或非结构化数据
而且所有的这些功能被集成到一个服务里面你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。
为什么要用ElasticSearch
全文检索开始使用SQL来写使用like进行模糊查询。如果数据量比较大用这种方法就会特别慢可以使用索引使得速度相对提高但还是达不到对大数据搜索的要求所以要使用分布式的全文搜索引擎ElasticSearch。
1)、ES原理剖析
索引和搜索流程图 绿色代表索引过程对要检索的内容进行索引构建一个索引库
索引过程包括确定的原始内容即要搜索的内容——采集文档——创建文档——分析文档——索引文档
红色代表搜索过程从索引库中搜索内容
搜索过程用户通过搜索界面——创建查询——执行搜索从索引库搜索——渲染搜索结果
二、Elasticsearch基本概念 索引Index
一个索引就是一个拥有几分相似特征的文档的集合。比如说你可以有一个客户数据的索引另一个产品目录的索引还有一个订单数据的索引。一个索引由一个名字来标识必须全部是小写字母的并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候都要使用到这个名字。
类型Type6.0.0版本中弃用
类型曾经是索引的逻辑类别/分区允许您在同一索引中存储不同类型的文档例如一种类型用于用户另一种类型用于博客帖子。
在一个索引中你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区其语义完全由你来定。
文档Document
一个文档是一个可被索引的基础信息单元。比如你可以拥有某一个客户的文档某一个产品的一个文档当然也可以拥有某个订单的一个文档。文档以JSONJavascript Object Notation格式来表示。文档必须被索引/赋予一个索引的type。 分片(Shards)
索引可能存储大量可能超过单个节点的硬件限制的数据。
如果我们的索引数据量很大超过硬件存放单个文件的限制就会影响查询请求的速度Es引入了分片技术。一个分片本身就是一个完成的搜索引擎文档存储在分片中而分片会被分配到集群中的各个节点中随着集群的扩大和缩小ES会自动的将分片在节点之间进行迁移以保证集群能保持一种平衡。分片有以下特点
ES的一个索引可以包含多个分片shard每一个分片shard都是一个最小的工作单元承载部分数据每个shard都是一个lucene实例有完整的简历索引和处理请求的能力增减节点时shard会自动在nodes中负载均衡一个文档只能完整的存放在一个shard上一个索引中含有shard的数量默认值为5在索引创建后这个值是不能被更改的。优点水平分割和扩展我们存放的内容索引分发和并行跨碎片操作提高性能/吞吐量每一个shard关联的副本分片replica shard的数量默认值为1这个设置在任何时候都可以修改。
副本(Replicasedit)
副本是对分片的复制。目的是为了当分片/节点发生故障时提供高可用性它允许您扩展搜索量/吞吐量因为可以在所有副本上并行执行搜索。
一个分片可以有多个复制分片也可以无复制分片。它的作用主要是防止分片故障加速查询索引等功能提供了高可用性。另外复制分片是不和主分片在一起的一个主分片在一台机器上它的复制分片可能分布在其它N台机器上。在这里我们可以把它理解为一个分片的复制就叫复制分片。每个分片会包含部分索引文件。文件由sgment组成 。
副本replica shard就是shard的冗余备份它的主要作用
1、冗余备份防止数据丢失
2、shard异常时负责容错和负载均衡 注意副本是乘法越多越浪费但也越保险。分片是除法分片越多单分片数据就越少也越分散。 集群
多台ES服务器的结合的统称叫ES集群一个集群包含多台服务器多个节点。
节点
一个节点是你集群中的一个服务器作为集群的一部分它存储你的数据参与集群的索引和搜索功能。
节点种类
主节点负责集群范围内轻量级的操作例如创建或删除索引。跟踪那些节点是集群的一部分以及确定将哪些碎片分配给哪些节点
数据节点包含已创建的索引文档的分片。数据节点处理及数据相关的操作。例如CRUD搜索和聚合
调节节点仅可路由请求处理搜索缩减阶段并分配批量索引。本质上仅协调节点充当智能负载平衡器
节点和分片如何工作
一个集群至少有一个节点而一个节点就是一个ElasticSearch进程节点可以有多个默认索引如果创建索引索引将会由5个分片primary shard又称主分片构成每一个分片会有一个复制分片 三、与传统的关系型数据库中的库、表、行、列等概念进行对比
关系型数据库 - Databases(库) - Tables(表) - Rows(行) - Columns(列)。
Elasticsearch - Indeces(索引) - Types(类型) - Documents(文档) - Fields(属性)。 RDBS ES 数据库database 索引index 表table 类型typeES6.0之后被废弃es7中完全删除 表结构schema 映射mapping 行row 文档document 列column 字段field 索引Schema 反向索引Mapping SQL 查询DSL SELECT * FROM table GET http://..... UPDATE table SET PUT http://...... DELETE DELETE http://......
1、关系型数据库中的数据库(database)等价与ES索引index
2、一个数据库下面有N张表table,等价与1个索引Index下面有N多类型Type 备注ES6.0之后被废弃es7中完全删除
3、一个数据库表table下的数据有多行row多列colum组成等价与一个Type由多文档document多字段field组成
4、在一个关系型数据库中索引Schema定义了表每个表的字段还有表和字段的之间关系与之对应在ES中反向索引Mapping定义索引下的Ttype的字段的处理规则即如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等
5、在数据库中新增 INSERT、删除 DELTE、修改 UPDATE、查询 SEARCH操作等价于ES中的新增PUT/POST、删除DELETE、修改_update、查询GET ES内置的RREST接口 搜索原理 1、客户端给DODE1发送请求查询名字叫张三的数据
2、P1节点接收到请求判断出当前数据的_ID对应的分片0且分片P1中的数据对应复制分片R0,R1都有就会将请求转发到R0进行处理
3、取出文档数据返回给P1最终返回给前端
更新原理 1、客户端给NODE1发送更新请求
2、它转发请求到主分片所在的节点NODE3
3、NODE3从主分片检索出文档修改_soure字段的JSON然后在主分片上重建索引如果有其他进程修改了文档它以retry_on_conflict设置的次数重复步骤3都未成功则放弃
4、如何NODE3更新文档成功它同时转发文档的新版本到NODE1和NODE2上的复制节点以重建索引。当所有复制节点更新成功NODE3返回成功给请求节点然后返回用户端
创建/删除原理 1、客户端发送请求创建、删除请求
2、根据文档ID它将转发请求到主分片所在节点NODE3
3、NODE3在主分片上执行请求如果成功将转发请求到NODE1和NODE2的复制分片上当所有复制分片成功则NODE3返回成功信息给请求节点。在将信息返回给客户端
字段数据类型
字符型text分词不能用于排序、过滤查询、聚合查询、keyWord
数字型byte、short、integer、float、double
布尔型boolean
日期型date
二进制型binary
对象类型object
字段属性
store是否储存字段原始值独立于_source字段
index是否参与索引
analyzer指定分词器
boost字段级别的分数加权
doc_values是否对不分词建立正排序索引
fleld_data是否对分词器建立正排序索引
properties类型映射
ignore_above超过指定字符的文本将忽略不被索引
include_in_all是否包含该字段到_all字段中
index_optionss倒排序索引的可选参数
norms是否储存长度因子和分数加权boost
null_value初始值
position_increment_gap指定多字段的多个值之间的位置间隔
search_analyzer指定搜索时分词器
similarity指定评分策略
term_vector指定返回哪些关于词条的统计信息
normalizer标注化处理器
coerce强制类型转换器
copy_to创建自定义的_all属性
dynamic动态映射策略
enabled是否处理字段正排序索引和倒排序索引
eager_global_ordinals是否立即加载全局序号
format指定日期格式
ignore_malformed忽略格式错误的字段
四、ES的特性
速度快、易扩展、弹性、灵活、操作简单、多语言客户端、X-Pack、hadoop/spark强强联手、开箱即用。
分布式横向扩展非常灵活全文检索基于lucene的强大的全文检索能力近实时搜索和分析数据进入ES可达到近实时搜索还可进行聚合分析高可用容错机制自动发现新的或失败的节点重组和重新平衡数据模式自由ES的动态mapping机制可以自动检测数据的结构和类型创建索引并使数据可搜索。RESTful APIJSON HTTP
五、索引的应用
创建索引
PUT project_v1
{settings: {number_of_shards: 1,number_of_replicas: 1},mappings: {properties: {name_cn: {type: text},name_en: {type: keyword},project_type: {type: keyword},people_count: {type: integer},order_count: {type: long},date: {type: date,format: yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||yyyy-MM||epoch_millis}}}
}
备注text 用于索引全文值的字段例如电子邮件正文或产品说明。它们通过分词器传递 以在被索引之前将字符串转换为单个术语的列表。分析过程允许Elasticsearch搜索单个单词中 每个完整的文本字段。文本字段不用于排序很少用于聚合。
keyword 用于索引结构化内容的字段例如电子邮件地址主机名状态代码邮政编码或标签。它们通常用于过滤排序和聚合。keyword字段只能按其确切值进行搜索。
有时候一个字段同时拥有全文类型text和关键字类型keyword是有用的一个用于全文搜索另一个用于聚合和排序。
number_of_shards 是指索引要做多少个分片只能在创建索引时指定后期无法修改。
number_of_replicas 是指每个分片有多少个副本后期可以动态修改
primary shard主分片每个文档都存储在一个分片中当你存储一个文档的时候系统会首先存储在主分片中然后会复制到不同的副本中。默认情况下一个索引有5个主分片。你可以在事先制定分片的数量当分片一旦建立分片的数量则不能修改。
replica shard副本分片每一个分片有零个或多个副本。副本主要是主分片的复制可以 增加高可用性提高性能。
默认情况下一个主分配有一个副本但副本的数量可以在后面动态的配置增加。
副本必须部署在不同的节点上不能部署在和主分片相同的节点上。
新增索引数据
PUT /project_v1/_doc/1
{name_en:encourage,name_cn:营销码,project_type:营销,people_count:4,order_count:1000000,date:2019-04-01
}
查询索引数据
GET /project_v1/_search
{query: {match_all: {}}
}匹配查询 match
GET /project_v1/_search
{query: {match: {name_cn: 营销}}
}
过滤查询 Filter
GET /project_v1/_search
{query: {bool: {filter: {range: {date: {gte: 2020-04-01}}}}}
}
六、Elasticsearch 聚合查询
1.聚合的概念
官方对聚合有四个关键字Metric(指标)、Bucketing(桶)、Pipeline(管道)、Matrix(矩阵)在查询请求体中以aggregations语法来定义聚合分析也可简写成aggs
Metric(指标)指标分析类型如计算最大值、最小值、平均值等对桶内的文档进行聚合分析的操作
Bucket(桶)分桶类型类似sql中的group by语法满足特定条件的文档的集合
Pipeline(管道)管道分析类型基于上一级的聚合分析结果进行再分析
Matrix(矩阵)矩阵分析类型聚合是一种面向数值型的聚合用于计算一组文档字段中的统计信息
2.Metric(指标)聚合
Metric聚合分析分为单值分析和多值分析两类
1、单值分析只输出一个分析结果
关键字有min maxavgsumcardinality
2、多值分析输出多个分析结果
关键字有statsextended_statspercentile_ranktop hits
1)、min maxavg sum
GET /project_v1/_search
{size: 0,aggs: {min_people_count: {min: {field: people_count}},max_order_count:{max: {field: order_count}},avg_order_count:{avg: {field: order_count}},sum_order_count:{sum: {field: order_count}}}
}
2)、cardinality
cardinality 关键字: 求唯一值即不重复的字段有多少相当于sql中的distinct
GET /project_v1/_search
{size: 0,aggs: {cardinality_project_type: {cardinality: {field: project_type}}}
}
3)、stats
统计信息请求后会直接显示各种聚合结果(countminmaxavgsum)
GET /project_v1/_search
{size: 0,aggs: {stats_order_count: {stats: {field: order_count}}}
}
4)、extended_stats
扩展的统计信息比stats返回更多的统计信息
GET /project_v1/_search
{size: 0,aggs: {extended_stats_order_count: {extended_stats: {field: order_count}}}
}
3.Bucket(桶)聚合
Bucket可以理解为一个桶它会遍历文档中的内容凡是符合某一要求的就放在一个桶中分桶相当于sql中的group by
关键字有Terms AggregationFilter AggregationHistogram AggregationDate Aggregation
1)、Terms Aggregation
根据某一项的每个唯一的值来聚合
GET /project_v1/_search
{size: 0,aggs: {terms_project_type: {terms: {field: project_type,size: 3}}}
}
2)、Filter Aggregation
指具体的域和具体的值可以在Terms Aggregation 的基础上进行了过滤只对特定的值进行了聚合
#查营销类型的总订单数
GET /project_v1/_search
{size: 0,aggs: {filter_project_type: {filter: {term: {project_type: 营销}},aggs: {sum_order_count: {sum: {field: order_count}}}}}
}
3)、Histogram Aggregation
Histogram与Terms聚合类似都是数据分组区别是Terms是按照Field的值分组而Histogram可以按照指定的间隔对Field进行分组
#项目规模
GET /project_v1/_search
{size: 0,aggs: {project_scale: {histogram: {field: people_count,interval: 1}}}
}
4)、Date Aggregation
针对时间格式数据的直方图聚合基本特性与Histogram Aggregation一致
#项目发展史
GET /project_v1/_search
{size: 0,aggs: {date_by_day: {date_histogram: {field: date,calendar_interval: day,min_doc_count: 1}}}
}
4.Pipeline(管道)聚合
管道的概念支持对聚合分析的结果再次进行聚合分析
#查项目类型最少人数的项目类型
GET /project_v1/_search
{size:0,aggs:{project_type:{terms: {field: project_type,size: 3},aggs:{sum_people_count:{sum: {field: people_count}}}},min_people_count_by_project_type:{min_bucket: {buckets_path: project_typesum_people_count}}}
}
5.总结
Metric(指标)分类并对一组文档进行sum、avg等数学运算
Bucketing(桶)桶聚合常规的分类然后计算每个分类的文档数量
Pipeline(管道)对聚合的结果再次聚合
Matrix(矩阵)可在多个字段上计算生成矩阵结果
七通过SQL查询Elasticsearch
1.为什么用SQL查询
Elasticsearch 的官方查询语言是 Query DSL既然是官方指定的说明最吻合 ES 的强大功能为ES做支撑。
其实SQL 作为一个数据库查询语言它语法简洁书写方便而且大部分服务端程序员都清楚了解和熟知它的写法。但是作为一个 ES 新人来说就算他已经是一位编程界的老江湖但是如果他不熟悉 ES 那么他如果要使用公司已经搭好的 ES 服务他必须要先学习 Query DSL学习成本也是一项影响技术开发进度的因素而且不稳定性高。但是如果 ES 查询支持 SQL的话那么也许就算他是工作一两年的同学他虽然不懂 ES的复杂概念他也能很好的使用 ES 而且顺利的参加到开发的队伍中毕竟SQL 都会写
2.Elasticsearch-SQL
Elasticsearch-SQL不属于 Elasticsearch 官方的它是 NLPChina中国自然语言处理开源组织开源的一个 ES 插件主要功能是通过 SQL 来查询 ES其实它的底层是通过解释 SQL将SQL 转换为 DSL 语法再通过DSL 查询。
查询语法
SELECT fields from indexName/type WHERE conditions
表名 tableName 的地方现在改为了索引名 indexName如果有索引Type 则indexName/type
POST _sql?formattxt
{query: select * from project_index limit 10
}
SQL翻译成DSL语句
POST _sql/translate
{query: select name_en,COUNT(*) from project_index GROUP BY name_en
}
八、注意点
1.版本问题
es 5到7的版本变动很大其中包括type的变动
5.x 支持多种type6.x 只能有一种type7.x 将去除type 没有类型的概念了
2.ES并不可靠
ES不是可靠的存储系统不是数据库它有丢数据的风险。ES不是实时系统数据写入成功只是trans log成功类似于mysql的bin log写入成功后立刻查询查不到是正常的。因为数据此刻可能还在内存里而不是进入存储引擎里。
3.同步问题
在需要添加新数据与新字段的时候如果elasticSearch进行搜索是可能需要重新修改格式。之前的数据需要重新同步对数据的管理有很多困难。
九、SpringBoot集成Elasticsearch
1.引入依赖
properties!--告诉springboot我们处理的ES的版本--elasticsearch.version7.10.2/elasticsearch.version
/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-elasticsearch/artifactId/dependency
/dependencies
2.yml配置es集群
spring:elasticsearch:rest:uris:- 192.168.53.112:9200- 192.168.53.113:9200- 192.168.53.114:92003.简单Test
3.1 创建索引以及分片设置
Test
public void createIndex() throws Exception{//1 创建索引并设置分片//1.1 创建一个RestHightLevelClient对象相当于和服务端建立连接。RestHighLevelClient client new RestHighLevelClient(RestClient.builder(//没有集群的话 此处可new 一个即可。new HttpHost(192.168.53.112,9200)new HttpHost(192.168.53.113,9200),new HttpHost(192.168.53.114,9200),));//1.2 使用client的索引管理的对象,indices()返回索引管理对象。IndicesClient indicesClient client.indices();//两个参数//1.2.1 创建索引请求对象 参数创建的索引库的名称CreateIndexRequest request new CreateIndexRequest(hello).settings(Settings.builder().put(number_of_shards, 5).put(number_of_replicas, 1).build());//1.2.2 请求选项使用默认值。配置请求头主要用于认证。CreateIndexResponse response indicesClient.create(request, RequestOptions.DEFAULT);//显示结果System.out.println(response.toString());}3.2 创建索引库并设置mapping信息
Test
public void createIndexAndMapping() throws Exception{RestHighLevelClient client new RestHighLevelClient(RestClient.builder(//没有集群的话 此处可new 一个即可。new HttpHost(192.168.53.112,9200)new HttpHost(192.168.53.113,9200),new HttpHost(192.168.53.114,9200),));//创建json数据XContentBuilder mappings XContentFactory.jsonBuilder().startObject().startObject(properties).startObject(id).field(type,long).endObject().startObject(title).field(type,text).field(analyzer,ik_smart).field(store,true).endObject().endObject().endObject();//创建索引请求对象 参数创建的索引库的名称分片副片数量以及mapping信息CreateIndexRequest request new CreateIndexRequest(hello1).settings(Settings.builder().put(number_of_shards, 5).put(number_of_replicas, 1).build()).mapping(mappings);//两个参数//1 创建索引请求对象 参数创建的索引库的名称//2 请求选项使用默认值。配置请求头主要用于认证。CreateIndexResponse response client.indices().create(request, RequestOptions.DEFAULT);//显示结果System.out.println(response.toString());}
}3.3删除索引库
Test
public void deleteIndex() throws Exception{RestHighLevelClient client new RestHighLevelClient(RestClient.builder(//没有集群的话 此处可new 一个即可。new HttpHost(192.168.53.112,9200)new HttpHost(192.168.53.113,9200),new HttpHost(192.168.53.114,9200),));//删除索引库AcknowledgedResponse response client.indices().delete(new DeleteIndexRequest(hello), RequestOptions.DEFAULT);//显示结果System.out.println(response.toString());} 3.4 添加索引库字段信息
Test
public void putIndex() throws Exception{RestHighLevelClient client new RestHighLevelClient(RestClient.builder(//没有集群的话 此处可new 一个即可。new HttpHost(192.168.53.112,9200)new HttpHost(192.168.53.113,9200),new HttpHost(192.168.53.114,9200),));String mappings {\n \t\t\t\properties\:{\n \t\t\t\t\id\:{\n \t\t\t\t\t\type\ : \long\\n \t\t\t\t},\n \t\t\t\t\title\ :{\n \t\t\t\t\t\type\ : \text\,\n \t\t\t\t\t\analyzer\ : \ik_smart\,\n \t\t\t\t\t\store\ : true\n \t\t\t\t},\n \t\t\t\t\ content\ :{\n \t\t\t\t\t\type\ : \text\,\n \t\t\t\t\t\analyzer\ : \ik_smart\,\n \t\t\t\t\t\store\ :true\n \t\t\t\t}\n \t\t\t}\n \t\t};//将字符串以json形式发送PutMappingRequest request new PutMappingRequest(hello1).source(mappings, XContentType.JSON);//修改索引库AcknowledgedResponse response client.indices().putMapping(request, RequestOptions.DEFAULT);//显示结果System.out.println(response.toString());
}十、Elasticsearch文档管理
0.抽取ES连接对象的公共方法
//原生客户端类即ESjava客户端。
private RestHighLevelClient client;
public void init(){//1.1 创建一个RestHightLevelClient对象相当于和服务端建立连接。client new RestHighLevelClient(RestClient.builder(//没有集群的话 此处可new 一个即可。new HttpHost(192.168.53.112,9200)new HttpHost(192.168.53.113,9200),new HttpHost(192.168.53.114,9200),));
}1.添加文档
使用RestHightLevelClient对象。
使用client对象的index方法添加文档
创建IndexRequest对象其中包含了索引库名称、文档id、文档的内容
{“id”:“1”,“title”:“测试文档1”,“content”:“测试文档中的内容”}
public void addDocument() throws Exception{String document {\id\:1, \title\:\这是测试文章\, \content\:\xxxxx\};//创建IndexRequest对象其中包含索引库名称文档id文档内容IndexRequest request new IndexRequest().index(hello1).id(1).source(document, XContentType.JSON);IndexResponse response client.index(request, RequestOptions.DEFAULT);System.out.println(response.toString());}
2.更新文档
使用client对象的update方法。
需要UpdateRequest参数
1.更新的索引
2.更新的文档的id
3.更新的文档内容
public void updateDocument() throws Exception{String document {\id\:1, \title\:\这是测试文章更细的\, \content\:\new update\};//创建IndexRequest对象其中包含索引库名称文档id文档内容UpdateRequest request new UpdateRequest().index(hello1).id(1).doc(document, XContentType.JSON);UpdateResponse response client.update(request, RequestOptions.DEFAULT);System.out.println(response.toString());}3.删除文档
使用client的delete方法
需要DeleteRequest对象需要两个参数
1.操作的索引
2.文档的id
public void deleteDocument() throws Exception{//创建IndexRequest对象其中包含索引库名称文档id文档内容DeleteRequest request new DeleteRequest(hello1, 1);DeleteResponse response client.delete(request, RequestOptions.DEFAULT);System.out.println(response.toString());}
4.根据id查询文档
使用client对象的get方法。
需要使用GetRequest对象两个参数
1.操作的索引
2.文档的id
public void getDocument() throws Exception{//创建IndexRequest对象其中包含索引库名称文档id文档内容GetRequest request new GetRequest(hello1, 1);GetResponse response client.get(request, RequestOptions.DEFAULT);System.out.println(response.toString());}
5.批量查询文档
使用client对象的bulk方法。
BulkRequest对象使用add方法添加要批量处理的请求。
支持的处理IndexRequestDeleteRequestUpdateRequest
public void bulkDocument() throws Exception{//json数据String jsonData [ {\id\:3, \title\:\这是测试文章1\, \content\:\xxxxx\, \comment\:\备注信息\, \mobile\:\13344556677\}\n {\id\:4, \title\:\这是一篇文章2\, \content\:\xxxxx\, \comment\:\备注信息\, \mobile\:\13344556677\}\n {\id\:5, \title\:\这是一篇文章3\, \content\:\xxxxx\, \comment\:\备注信息\, \mobile\:\13344556677\}];//转换成json格式字符串JSONArray jsonArray JSONObject.parseArray(jsonData);//创建IndexRequest对象其中包含索引库名称文档id文档内容BulkRequest request new BulkRequest();jsonArray.stream().forEach(json - {IndexRequest r new IndexRequest().index(hello1).id(((JSONObject) json).getString(id)).source(((JSONObject) json).toJSONString(), XContentType.JSON);request.add(r);});BulkResponse response client.bulk(request, RequestOptions.DEFAULT);System.out.println(response.toString());}
十一、ElasticsearchRestTemplate类与ElasticsearchRepository类
SpringData对ES的封装ElasticsearchRestTemplate类可直接使用此类在ElasticsearchRestTemplate基础上进行性一定程度的封装使用起来更方便灵活拓展性更强。
ElasticsearchRepository可以被继承操作ES是SpringBoot对ES的高度封装操作最为方便但牺牲了灵活性。
索引库实体类
Data
Document(indexName blog_1, shards 5, replicas 1)
public class Blog {Field(type FieldType.Long, store true)private Long id;//type FieldType.Text 字段类型为text//analyzer ik_max_word 分词器为ik_max_word//store true 存储 是Field(type FieldType.Text, analyzer ik_max_word, store true)private String title;Field(type FieldType.Text, analyzer ik_max_word, store true)private String content;Field(type FieldType.Text, analyzer ik_max_word, store true)private String comment;Field(type FieldType.Keyword, store true)private String mobile;}1、使用ElasticsearchRestTemplate类
a)、创建索引库
Autowired
private ElasticsearchRestTemplate template;/*** 创建索引库*/public void createIndex(){//创建索引库template. indexOps(IndexCoordinates.of(mytest)).create();}
b)、创建索引库并实体类设置mapping
1创建索引库
template.indexOps(IndexCoordinates.of(“mytest”)).create();
2设置mapping信息
需要创建一个实体类其中配置实体类和文档的映射关系使用注解配置。
可以从Entity中生成mapping信息。
public void putMapping(){//创建索引库Document mapping template.indexOps(IndexCoordinates.of(mytest)).createMapping(Blog.class);template.indexOps(IndexCoordinates.of(mytest)).putMapping(mapping);
}c)、删除索引库 //删除索引库public void deleteIndex(){template.indexOps(IndexCoordinates.of(hello1)).delete();}d)、索引库查询
public void maxQueryTest(){NativeSearchQuery builder new NativeSearchQueryBuilder()//多字段查询 高亮跟查询条件有关.withQuery(QueryBuilders.multiMatchQuery(8, id,title))//增加过滤条件, 可以设置多个.withFilter(QueryBuilders.boolQuery()//增加bool查询should的term关键字查询.should(QueryBuilders.termQuery(title, 文章)).should(QueryBuilders.termQuery(content,xxx)))//增加过滤条件的关键字查询.withFilter(QueryBuilders.termQuery(mobile, 13344556677))//分页设置.withPageable(PageRequest.of(0,5))//设置高亮.withHighlightBuilder(new HighlightBuilder()//高亮显示的字段.field(title)//高亮显示的字段.field(content)//高亮显示的前缀.preTags(em)//高亮显示的后缀.postTags(/em))//添加聚合查询.addAggregation(new TermsAggregationBuilder(mobile_group).field(mobile)).build();//基于Blog.class 类型返回的结果SearchHitsBlog searchHits template.search(builder, Blog.class);//从searchHits取相关数据long totalHits searchHits.getTotalHits(); //取总记录数ListSearchHitBlog list searchHits.getSearchHits(); //取每条数据放入集合中System.out.println(总记录数为 totalHits);list.forEach(blogSearchHit - {//取原生文档对象Blog blog blogSearchHit.getContent();System.out.println(blog);//取高亮对象MapString, ListString highlightFields blogSearchHit.getHighlightFields();System.out.println(highlightFields);//取高亮对象 放到Blog里去 这样就将Blog和高亮结合输出了String title highlightFields.get(title).get(0);//String content highlightFields.get(content).get(0);blog.setTitle(title);//blog.setContent(content);System.out.println(blog);});//取聚合结果Aggregations aggregations searchHits.getAggregations();System.out.println(aggregations.toString());}
2、使用ElasticsearchRepository类
a)、创建接口继承ElasticsearchRepository
public interface BlogRepository extends ElasticsearchRepositoryBlog, Long {/*** 定义一个方法查询根据title查询es** 原因 ElasticsearchRepository会分析方法名,参数对应es中的field这就是灵活之处* param title* return java.util.Listcom.yt.cubemall.search.model.Blog*/ListBlog findByTitle(String title);/*** 定义一个方法查询 根据titlecontent查询es*/ListBlog findByTitleAndContent(String title, String content);}
b)、使用BlogRepository接口
public class BlogRepositoryTest {Autowiredprivate BlogRepository blogRepository;/*** 添加文档*/Testpublic void addDocument(){Blog blog new Blog();for (int i 0; i 10; i) {blog.setId((long)i1);blog.setTitle(测试spring集成esi1);blog.setContent(sjihfapfi1);blog.setComment(注释内容i1);blog.setMobile(12345678901);blogRepository.save(blog);}}/*** 更新文档*/Testpublic void updateDocument(){OptionalBlog optional blogRepository.findById(1l);if (optional.isPresent()){Blog blog optional.get();blog.setTitle(hello update);blogRepository.save(blog);}}/*** 删除文档*/Testpublic void deleteDocument() {blogRepository.deleteById(1l);}/*** 查询所有 文档*/Testpublic void getDocument() {//根据id查找//OptionalBlog optional blogRepository.findById(1l);//Blog blog optional.get();//System.out.println(blog);//查找全部//IterableBlog all blogRepository.findAll();//all.forEach(blog - System.out.println(blog));//分页查找全部IterableBlog all blogRepository.findAll(PageRequest.of(1,10));all.forEach(blog - System.out.println(blog));}/*** 自定义方法根据title内容查询索引库* /Testpublic void testFindByTitle(){ListBlog blogList blogRepository.findByTitle(测试);blogList.stream().forEach(System.out::println);}/*** 自定义方法根据titlecontent内容查询索引库* /Testpublic void testFindByTitleAndContent(){ListBlog blogList blogRepository.findByTitleAndContent(测试, sjihfapf);blogList.stream().forEach(System.out::println);}
}}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926570.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!