Elasticsearch的使用RestHighLevelClient

文章目录

          • 一、准备
            • 1. 导入依赖
            • 2. 测试数据
          • 二、全文搜索
            • 2.1. 匹配搜索(会拆词)
            • 2.2. 短语搜索
            • 2.3. queryString搜索
            • 2.4. 多字段匹配搜索
          • 三、词条级搜索
            • 3.1. 词条级搜索
            • 3.2. 词条集合搜索(terms query)
            • 3.3. 范围搜索( range query)
            • 3.4. 不为空搜索(exists query)
            • 3.5. 词项前缀搜索(prefix query)
            • 3.6. 通配符搜索(wildcard query)
            • 3.7. 正则搜索
            • 3.8. 模糊搜索(fuzzy query)
            • 3.9. ids搜索(id集合查询)(ids query)
          • 四、复合查询
            • 4.1. 复合查询
            • 4.2. 排序
          • 五、分词器
            • 5.1. 不设置分词器,使用默认分词器
            • 5.2. 指定分词器,使用IK最大分词
            • 5.3. 指定分词器,使用IK最小分词

一、准备
1. 导入依赖
 <!--springboot <=2.2.5 需要指定es版本默认引入es版本6.x--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
2. 测试数据
PUT /yuangong 
{"settings": {},"mappings": {"properties": {"name": {"type": "text","analyzer": "ik_max_word"},"alias": {"type": "text"},"age": {"type": "integer"},"sex": {"type": "keyword"},"phone": {"type": "text"},"title": {"type": "text","analyzer": "ik_max_word"},"slogan": {"type": "text"}}}
}POST /yuangong/_doc/
{"name": "张三三","alias": "小张","age": 28,"sex": "男","phone": 183xxxx0000,"title": "初级Java开发","slogan": "苟富贵,勿相忘"
}POST /yuangong/_doc/
{"name": "李四","alias": "小四","age": 25,"sex": "男","phone": 183xxxx0001,"title": "高级Java开发","slogan": "行路难,行路难,多歧路,今安在"
}POST /yuangong/_doc/
{"name": "王五","alias": "五哥","age": 30,"sex": "男","phone": 183xxxxx0002,"title": "资深Java开发","slogan": "逾期感慨路难行,不如马上出发"
}POST /yuangong/_doc/
{"name": "王六","alias": "名与","age": 28,"sex": "男","phone": 183xxxx0003,"title": "高级前端开发","slogan": "超越自己"
}POST /yuangong/_doc/
{"name": "王狗蛋","alias": "狗蛋","age": 31,"sex": "男","phone": 183xxxx0004,"title": "高级产品经理","slogan": "明哲保身"
}POST /yuangong/_doc/
{"name": "王麻子","alias": "逍遥子","age": 30,"sex": "女","phone": 183xxxx0005,"title": "资深业务专家","slogan": "鹏之大不知其几千里也"
}POST /yuangong/_doc/
{"name": "周二","alias": "二子","age": 22,"sex": "男","phone": 18300000006,"title": "初级测试开发","slogan": "冷冷的冰雨在我脸上胡乱的拍"
}
二、全文搜索
2.1. 匹配搜索(会拆词)

和数据类型有关

(1)如果被查询的字段是keywork,查询的时候只能全量匹配,不会被拆分

(2)如果查询字段类型是text,查询的值会根据查询字段的分词器进行分词

如:如果没有设置分词器,张三三会拆成张、三、三,匹配出包含【张】或者【三】或者【三】的数据

如:如果设置IK分词器,

"name": {"type": "text","analyzer": "ik_max_word"}

张三三会拆成张三、三三,匹配出包含【张三】或者【三三】的数据

如:如果设置IK分词器,三三会拆成三三,匹配出包含【三三】的数据

(3)上面使用的是默认的operator默认OR, 设置operator为AND的时候

如:如果没有设置分词器,张三三会拆成张、三、三,匹配出包含【张】并且【三】并且【三】的数据

如:如果设置IK分词器,张三三会拆成张三、三三,匹配出包含【张三】并且【三三】的数据

如:如果设置IK分词器,三三会拆成三三,匹配出包含【三三】的数据

public void matchQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "三三").operator(Operator.OR);doSearch(searchRequest,searchSourceBuilder,matchQueryBuilder);
}
2.2. 短语搜索
public void matchPhraseQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("title", "JAVA开发").slop(1);doSearch(searchRequest,searchSourceBuilder,matchPhraseQueryBuilder);
}
2.3. queryString搜索

查询时可以不指定字段查询

    public void queryString() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//        QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery("不");QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery("不").field("slogan");doSearch(searchRequest,searchSourceBuilder,queryStringQueryBuilder);}
2.4. 多字段匹配搜索
public void multiMatchQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery("明","alias","slogan");doSearch(searchRequest,searchSourceBuilder,multiMatchQuery);
}
三、词条级搜索
3.1. 词条级搜索

类似于SQL里面的like
①、和字段的数据类型有关,如果数据类型是text但是没有指定分词器
例如:张三三,不指定分词器,这个词会被拆分成张、三、三
如果你termQuery里面的value为张三、三三,或者张三三都是无法查询到的;只有搜索张或者三才能搜索到
②、和字段的数据类型有关,如果数据类型是text但是指定IK分词器
例如:张三三,指定IK分词器,这个词会被拆分成张三、三三
如果你termQuery里面的value为张,三,或者张三三都是无法查询到的;只有搜索张三或者三三才能搜索到
③、和字段的数据类型有关,如果数据类型是keyword
搜索只能是用张三三作为搜索

public void termQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();TermQueryBuilder termQuery = QueryBuilders.termQuery("name","张三三");doSearch(searchRequest,searchSourceBuilder,termQuery);}
3.2. 词条集合搜索(terms query)

类型与SQL里面的in

public void termsQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();TermsQueryBuilder termsQuery = QueryBuilders.termsQuery("slogan","不","鹏");doSearch(searchRequest,searchSourceBuilder,termsQuery);
}
3.3. 范围搜索( range query)
/*** 大于或大于等于某个值* @param from 被比较的值* @param includeLower 是否包含这个值* @return*/
public RangeQueryBuilder from(Object from, boolean includeLower){}/*** 小于或小于等于某个值* @param to 被比较的值* @param includeLower 是否包含这个值* @return*/
public RangeQueryBuilder to(Object to, boolean includeLower){}
3.4. 不为空搜索(exists query)

相当 SQL 中的 column is not null

public void existsQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();ExistsQueryBuilder existsQuery = QueryBuilders.existsQuery("sex");doSearch(searchRequest,searchSourceBuilder,existsQuery);}
3.5. 词项前缀搜索(prefix query)

注意prefix query会和分词器联动

①、如果是keyword,可以随意前缀

②、如果设置了分词器,会根据分词器分的第一个词作为前缀。

如不设置分词器,使用默认分词器,词汇张三三,会被切分成张、三、三,这时候前缀只能查张,此时搜索张三或者张三三无效

如设置分词器为IK,词汇张三三,会被切分成张三、三三,这时候前缀只能查张三,此时搜索张无效

public void prefixQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();PrefixQueryBuilder prefixQuery = QueryBuilders.prefixQuery("title","资深");doSearch(searchRequest,searchSourceBuilder,prefixQuery);
}
3.6. 通配符搜索(wildcard query)
public void wildcardQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();WildcardQueryBuilder wildcardQuery = QueryBuilders.wildcardQuery("name","张*三").boost(2);doSearch(searchRequest,searchSourceBuilder,wildcardQuery);
}
3.7. 正则搜索
public void regexpQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();RegexpQueryBuilder regexpQueryBuilder = QueryBuilders.regexpQuery("title","高级.*");doSearch(searchRequest,searchSourceBuilder,regexpQueryBuilder);
}
3.8. 模糊搜索(fuzzy query)
public void fuzzyQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("title","高级");doSearch(searchRequest,searchSourceBuilder,fuzzyQueryBuilder);
}
3.9. ids搜索(id集合查询)(ids query)
public void idsQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();IdsQueryBuilder idsQueryBuilder = QueryBuilders.idsQuery().addIds("t1UY3nsB1bu3ZtXKDENc");doSearch(searchRequest,searchSourceBuilder,idsQueryBuilder);
}
四、复合查询
4.1. 复合查询
public void boolQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();MatchQueryBuilder matchTitleQueryBuilder = QueryBuilders.matchQuery("title", "高级");RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(25,false).to(30);BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(matchTitleQueryBuilder).mustNot(rangeQueryBuilder);doSearch(searchRequest,searchSourceBuilder,boolQueryBuilder);
}
4.2. 排序
public void sortQuery() throws IOException {//  搜索请求对象SearchRequest searchRequest = new SearchRequest("yuangong");//  搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();MatchQueryBuilder matchTitleQueryBuilder = QueryBuilders.matchQuery("title", "高级");RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(25,false).to(30);BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(matchTitleQueryBuilder).mustNot(rangeQueryBuilder);doSearch(searchRequest,searchSourceBuilder,boolQueryBuilder);
}public void doSearch(SearchRequest searchRequest,SearchSourceBuilder searchSourceBuilder,QueryBuilder query) throws IOException {//  sort,text字段不能用于排序FieldSortBuilder age = SortBuilders.fieldSort("age").order(SortOrder.ASC);searchSourceBuilder.query(query).sort(age);//  向搜索请求对象中设置搜索源searchRequest.source(searchSourceBuilder);//  执行搜索,向ES发起http请求SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);//  搜索结果SearchHits hits = searchResponse.getHits();System.out.println(Arrays.toString(hits.getHits()));
}
五、分词器

查看要查询的词是被如何分词了

5.1. 不设置分词器,使用默认分词器
# 不设置分词器,使用默认分词器
POST _analyze
{"text": "资深Java开发"
}

分词结果:

{"tokens" : [{"token" : "资","start_offset" : 0,"end_offset" : 1,"type" : "<IDEOGRAPHIC>","position" : 0},{"token" : "深","start_offset" : 1,"end_offset" : 2,"type" : "<IDEOGRAPHIC>","position" : 1},{"token" : "java","start_offset" : 2,"end_offset" : 6,"type" : "<ALPHANUM>","position" : 2},{"token" : "开","start_offset" : 6,"end_offset" : 7,"type" : "<IDEOGRAPHIC>","position" : 3},{"token" : "发","start_offset" : 7,"end_offset" : 8,"type" : "<IDEOGRAPHIC>","position" : 4}]
}
5.2. 指定分词器,使用IK最大分词
# 指定分词器,使用IK最大分词
POST _analyze
{"analyzer": "ik_max_word","text": "南京市长江大桥"
}

分词结果 :

{"tokens" : [{"token" : "南京市","start_offset" : 0,"end_offset" : 3,"type" : "CN_WORD","position" : 0},{"token" : "南京","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 1},{"token" : "市长","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 2},{"token" : "长江大桥","start_offset" : 3,"end_offset" : 7,"type" : "CN_WORD","position" : 3},{"token" : "长江","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 4},{"token" : "大桥","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 5}]
}
5.3. 指定分词器,使用IK最小分词
# 指定分词器,使用IK最小分词
POST _analyze
{"text": "南京市长江大桥","analyzer": "ik_smart"
}

分词结果:

{"tokens" : [{"token" : "南京市","start_offset" : 0,"end_offset" : 3,"type" : "CN_WORD","position" : 0},{"token" : "长江大桥","start_offset" : 3,"end_offset" : 7,"type" : "CN_WORD","position" : 1}]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手带你搭建一个自己的云服务器并部署Web程序

一. 服务器的购买 我选择的是阿里云的服务器&#xff0c;学生价9.5元一个月&#xff0c;百度直接搜索阿里云&#xff0c;然后点击右上角登录&#xff0c;推荐大家用支付宝扫码登录&#xff0c;方便快捷。阿里云官网的东西比较多&#xff0c;登录后我找了很久也没有找到学生服务…

QingStor分布式存储全线升级:自研需要勇气,成功还要看实力

数据量的爆炸式增长和企业对数据价值挖掘的渴求&#xff0c;正在让存储市场迎来前所未有的发展机遇。一方面&#xff0c;分布式存储正在经历快速的增长时期&#xff0c;IDC 2019年市场预测报告显示&#xff0c;无论是对象存储、文件存储还是块存储&#xff0c;分布式存储在未来…

加入阿里技术团队三年,哪些习惯让我在工作上持续受益?

2017年研究生毕业&#xff0c;我加入阿里巴巴数据库技术团队&#xff0c;从事分布式数据库研发&#xff0c;如今算来已经有三年时间了&#xff0c;在这期间&#xff0c;我深度参与了双十一背后的数据库PolarDB-X从设计到实现的全过程。在这三年的时间里&#xff0c;于我而言&am…

学习笔记之数据可视化(二)——页面布局(上)

~续上一章 2. 项目页面布局2.1 基础布局2.1.1 PC端屏幕宽度适配设置2.1.2 主体容器viewport背景图片2.1.3 HTML结构2.1.4 css样式代码2.2 边框图片2.2.1 使用场景2.3 面板公共样式开发2.3.1 面板边框图片尺寸测量2.3.2 面板 Panel 子容器`.inner`2.3.3 子容器 .inner 边距调整2…

阿里每天究竟要抵御多少攻击

知乎上曾经有一个很有趣的问题。 黑客为什么不攻击淘宝&#xff1f; 这个问题有趣就有趣在&#xff0c;这是典型的外行思维&#xff0c;看似很有道理&#xff0c;但其实问都问错了。 正确的问题是&#xff0c;黑客到底有哪天不在攻击淘宝&#xff1f; 答案是&#xff0c;0.…

征战多云时代,Nutanix这款Kubernetes多云PaaS新利器,你Get到了吗?

当前&#xff0c;全球企业上云步伐加快&#xff0c;企业都有相同的目标&#xff1a;尽快将业务迁移上云&#xff0c;从而减少基础架构成本&#xff0c;提高员工效率&#xff0c;缩短业务研发时间&#xff0c;提供性能可靠的IT系统。 当下&#xff0c;以容器、服务网格、微服务…

学习笔记之数据可视化(二)——页面布局(中)

续上一章 2.6 监控区域布局2.6.1 布局结构解析:2.6.2 样式描述:2.6.3 HTML结构及CSS样式代码2.6.3 ### 监控区域-效果2.6.7 点位区域(point)2.6 监控区域布局 监控区域 monitor盒子高度: 480px,布局划分及内部盒子类名如下: 2.6.1 布局结构解析: .tab样切换:tabs 标…

OFD文件、pdf文件相互转换、ofd文件在线预览

文章目录一、在线预览1. api使用2. 案例3. 效果二、ofd转odf2.1. api使用2.2. 参考案例三、odf转ofd3.1. api使用3.2. 参考案例3.3. 开源项目一、在线预览 1. api使用 ofd文件在线预览: 使用方式&#xff1a; 格式&#xff1a;/ofdViewer/viewer.html?file1.ofd相对路径 2.…

视频会议应用空间广阔 未来“上云”将成趋势

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 此次疫情推动云计算产业迎来加速发展期。此前&#xff0c;根据国务院发展研究中心发布的报告显示&#xff0c;2019年我国云计…

【开发者成长】Vue.js 中有哪些性能陷阱

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 我内心深处对游戏的热爱&#xff0c;让我一直渴望能自己制作一些电子游戏。几个月前我开始将这种梦想变为现实&#xff0c;并…

学习笔记之数据可视化(二)—— 页面布局(下)

续上一章 2.7 地图区域(.map)2.7.1 实现步骤:2.8 用户统计模块2.8.1 布局:2.8.2 柱状图2.9 订单模块2.9.1 订单区域布局2.9.2 订单区域(order)-交互效果(此部分后续补充)3.0 销售统计( sales )3.0.1 布局3.1 渠道分布、季度进度模块3.1.1渠道分布(channel)-雷达图3.1.2…

【职业生涯】这样的开发人员每个团队都想要

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 合作是你职业生涯中不会缺少的一个部分。 什么是团队&#xff1f;团队就为了共同目标而努力的一群人。一个团队实现目标的过…

elasticsearch-7.15.2 同时支持中文ik分词器和pinyin分词器

文章目录1. 自定义分词器2. 映射模型3. 效果图1. 自定义分词器 ES如何支持拼音和中文分词 &#xff1f; 自定义分词器 支持拼音和中文分词 PUT /jd_goods {"settings": {"analysis": {"analyzer": {"ik_smart_pinyin": {"type&…

【数字康复治疗】自闭症市场能否走出供求困境

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 世界卫生组织将每年的4月2日设为“世界提高自闭症意识日”&#xff0c;旨在提高人们对自闭症和相关研究与诊断以及自闭症患者…

微软全球 AKS 女掌门人,这样击破云原生“怪圈”!

来源 | 程序人生作者 | 伍杏玲近年来&#xff0c;“云原生”成为IT界的热词&#xff0c;可什么是“云原生”&#xff1f;不少开发者表示“云里雾里”&#xff0c;更别提如何借助云原生更好地释放云价值。从云原生&#xff08;CloudNative&#xff09;一词中我们看到&#xff0c…

获取Access表字段类型的自定义函数

目录 1.函数(一)1.1 功能说明及代码1.2 自定义函数调用实例2函数(二)3 函数(三)3.1 功能说明及代码3.2 自定义函数调用4 ADO数据类型在Access、SQL Server、Oracle之间的对应关系1.函数(一) 1.1 功能说明及代码 场景:在需要对表中字段的类型进行识别判断时,当用Fie…

【数据库】一个 rm -rf 把公司整个数据库删没了

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 经历了两天不懈努力&#xff0c;终于恢复了一次误操作删除的生产服务器数据。 对本次事故过程和解决办法记录在此&#xff0c…

elasticsearch-7.15.2 集成pinyin分词器

文章目录1. 下载拼音分词器2. es集成pinyin3. 启动es4. pinyin分词5. 效果图6. 开源项目1. 下载拼音分词器 链接&#xff1a;https://github.com/medcl/elasticsearch-analysis-pinyin 2. es集成pinyin 方式任选其中一种即可 第一种&#xff1a;在线安装 ./bin/elasticsear…

【智能AI】准确率97%的开源肺炎检测模型

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 最近&#xff0c;一位澳大利亚的人工智能博士候选人在 LinkedIn 上发布了一篇关于 SARS-CoV-2 病毒的研究文章。由于极具话题…

豪气!华为放话:3年培养100万AI人才!网友神回应了

大家经常把BAT挂在嘴边&#xff0c;但是可能有些人还不知道&#xff0c;华为的体量早已超越了这三巨头&#xff0c;只是迟迟不肯上市。华为的创始人任正非曾说表&#xff1a;上不上市不重要&#xff0c;最重要的是要让中国华为的技术能够称霸全球&#xff01;华为对技术的重视&…