大鹏网站建设建设心理网站

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,一经查实,立即删除!

相关文章

315网站行业公司注册网站官网

文章目录 模型介绍网络结构数据集可视化网络的其他细节模型推理 模型介绍 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络,实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。 该模型一个重要应用领域是域迁移(Do…

寻找外贸客户的网站手机端怎么变成电脑端

1前面我们已经熟悉了opengl自定义顶点生成一个立方体,并且我们实现了立方体的旋转,光照等功能。下面我们来用opengl来加载一个obj文件。准备我们首先准备一个简单的obj文件(head.obj)。资源在本页下载 2 在obj文件里面&#xff0c…

3GPP 常用协议标准

3GPP 常用协议标准2025-10-04 03:42 flyfish163 阅读(0) 评论(0) 收藏 举报系统架构 TS 38.401  NG-RAN; Architecture description TS 38.300  NR; NR and NG-RAN Overall description; Stage-2 TS 23.501  …

wordpress调用api接口网站seo策略

在嵌入式平台中如何实现广域网下的远程登录控制? 文章目录1 项目需要2 解决方案3 首先实现局域网下的VNC远程控制4 总结1 项目需要 在IM.X6q硬件平台,Linux4.1.15内核版本中实现在广域网下进行远程登录控制。主控机为Windows机器,被控机是IM…

北京建设部安全员证书查询网站婚纱网站内容制作

1、当发送的报文出问题的时候,会发送一个 ICMP 的差错报文来报告错误,但是如果 ICMP 的差错报文也出问题了呢? 答:不会导致产生 ICMP 差错报文的有: ICMP 差错报文(ICMP 查询报文可能会产生 ICMP 差错报文…

注册域名去哪个网站好企业年报信息查询

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 通过IDE自动生成的代码调用webservice服务 我们的IDE一般来说都是能够通过各种各样的工具来支持我们的开发使我们的开发变得更加的便捷。…

东莞清洁服务网站建设抓取式网站建设

一. MQ 简介 消息队列作为高并发系统的核心组件之一,能够帮助业务系统结构提升开发效率和系统 稳定性,消息队列主要具有以下特点: 削峰填谷:主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题系统解耦:解决不同重要程度、不…

长葛住房和城乡建设局网站怎么管理购物网站

前言 ARM SOC 有别于单片机 MCU 的一点就是,ARM SOC 的 GPIO 比较少,基本上引脚都有专用的功能,因为它很少去接矩阵键盘、众多继电器、众多 LED。 但有时 ARM SOC 又需要三五个按键,这时候 LRADC 就是一个不错的选择,…

网页制作与网站建设实战教程视频公司没注册可以做网站吗

>> (右移运算) x >> y:表示将x的二进制值右移y位。 正数是直接右移y位,则高位(最左边)补y个0。 负数是求补码,然后右移y位,最高位补y个1,再求反码&#xff…

网站挂到国外服务器做网站设计

思路 构建一个单调递增的队列类型,pop和push操作在队列内部进行特殊定义(队头存储当前滑动窗口的最大值;队列中比插入元素小的队尾元素均要移除;比队尾元素小的元素直接插入队列;当滑动窗口移除的元素和队头元素相等时…

怎么在移动端网站下面做联系人雄安专业网站建设电话

粘贴一篇关于权限的文章:最近在做个东西,巧合碰到了sharedUserId 的问题,所以收集了一些资料,存存档备份。安装在设备中的每一个apk文件,Android 给每个 APK 进程分配一个单独的用户空间,其 manifest 中的 userid 就是…

广州高档网站建设微信公众号制作模板免费

安防视频监控国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发&#xff…

php网站开发职责重庆公司注册网站

MyBatis关联查询(二、一对多查询) 需求:查询所有用户信息及用户关联的账户信息。 分析:用户信息和他的账户信息为一对多关系,并且查询过程中如果用户没有账户信息,此时也要将用户信息查询出来&#xff0c…

丽水市城乡建设局网站公司网站用什么语言开发

摘要 信息技术的发展推动了管理系统的进步,目前各种行业都积极参与管理系统的建设工作。特别是疫情带来的影响,让传统行业逐渐认识到只有通过在线管理才能继续的发展。房产销售平台是为求租者提供房源必备的平台,如何找到一个好的房源是生活…

做seo必须有网站吗网站后台管理入口

最近在把以前写的一个项目改成用easyui做前端。过程中遇到了不少问题。其中一个就是datagrid不能很好的布局。想了好多办法都有局限。最后想到会不会是布局(easyui-layout)的问题,经过实验,最后问题解。 1:比如在项目中…

网站出现的问题吗宁波高端网站设计价格

1.什么是atomikos Atomikos是一个轻量级的分布式事务管理器,实现了Java Transaction API (JTA)规范,可以很方便的和Spring Boot集成,支持微服务场景下跨节点的全局事务。Atomikos公司官方网址为:https://www.atomikos.com/。其旗下…

校区网站建设30人的网站建设公司年利润是多少

基础概念公式推到可参考该专栏下的前几篇博文。 纬向破斜组织图: 下半部分(从左往右):,3上2下2上1下,右斜,飞数为1 上半部分(从下往上):,2上2下1上3下。左斜,飞数为-1 通过分析可…

设计商城商务网站营销案例最新

7. out_of_focus_deblur_filter.cpp使用维纳滤波器来恢复失焦的图像 代码的主要功能是通过使用维纳滤波器来恢复失焦的图像,它读取一个灰度图像文件,对其进行滤波操作,并将结果保存为新文件。这个过程包括计算点扩散函数(PSF),执行…

通辽市做网站公司版权申请网站

目录 1.触发器1.1.DDL触发器1.2.DML触发器1.3.创建触发器1.3.1.创建DML触发器1.3.2.创建DDL触发器1.3.3.嵌套触发器1.3.4.递归触发器1.4.管理触发器1.触发器 触发器是一种特殊的存储过程,与表紧密关联。 1.1.DDL触发器 当服务器或数据库中发生数据定义语言&#xff…

网站建设推广熊掌号鞋网站建设

🎶Leetcode 151. 反转字符串中的单词 难度:中等 ✨题目描述: 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 …