Elasticsearch高级二
Elasticsearch高级二
Elasticsearch查询详解
查询Query
代码
public class EsDemo2 {static String index = "test";static String type = "emp";public static void main(String[] args) throws Exception{Settings settings = Settings.builder().put("cluster.name", "elasticsearch").put("client.transport.sniff", true).build();TransportClient client = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("hadoop110"), 9300));testSearch(client);}public static void testSearch(TransportClient client){SearchResponse searchResponse = client.prepareSearch(index).setQuery(QueryBuilders.< !-- matchAllQuery() 具体的查询方法 -- >).get();SearchHits hits = searchResponse.getHits();//获取总条数long totalHits = hits.getTotalHits();System.out.println("数据的总条数"+totalHits);//打印所有数据内容SearchHit[] hits1 = hits.getHits();for (SearchHit hit:hits1) {System.out.println(hit.getSourceAsString());}}
matchAllQuery() 查询所有数据
结果: 数据的总条数6 {"name":"jessic","age":18} {"name":"zs","age":16} {"name":"jack","age":19} {"name":"lili","age":16} {"name":"zs","age":15} {"name":"tom","age":19}
matchQuery((“name”,“zs”)) 根据指定列进行模糊查询 不支持通配符
数据的总条数2 {"name":"zs","age":16} {"name":"zs","age":15}
multiMatchQuery(“zs”,“name”,“city”) 在多个列中进行模糊查询 查询的列不存在不会报错
数据的总条数2 {"name":"zs","age":16} {"name":"zs","age":15}
queryStringQuery(“name:z*”) Lucene提供的方法支持对某一列查询的时候使用通配符
数据的总条数2 {"name":"zs","age":16} {"name":"zs","age":15}
boolQuery()
.should(QueryBuilders.matchQuery(“name”,“zs”).boost(10.0f)) .should(QueryBuilders.matchQuery(“age”,19).boost(1.0f))
根据不同的条件进行多次查询 可以根据boost值来设置两条语句的结果先后顺序
数据的总条数4 {"name":"zs","age":16} {"name":"zs","age":15} {"name":"jack","age":19} {"name":"tom","age":19}
termQuery(“name”,“abc xyz”) 查询的时候不会进行分词的精确查询
数据的总条数0
在默认情况之下es会将所有词进行分词索引,这是你试试用及精确查询时查不到的
解决方案
在创建索引的时候将不需要进行分词的特殊索引指定不分词
根据Lucene提供的方法直接查询可以对已经分词的索引进行精确查询
queryStringQuery(“name:“abc xyz””)
数据的总条数1 {"name":"abc xyz","age":15}
matchQuery(“name”,“abc xyz”).operator(Operator.AND) 也可以对已经分词的索引进行精确查询
数据的总条数1 {"name":"abc xyz","age":15}
其他查询
from、size 分页
.setFrom(2) .setSize(3) {"name":"jack","age":19} {"name":"lili","age":16} {"name":"abc xyz","age":15}
sort 排序
.setQuery(QueryBuilders.matchAllQuery()) //取出所有数据 .addSort("age", SortOrder.DESC) //按照年龄降序排序{"name":"jack","age":19} {"name":"tom","age":19} {"name":"jessic","age":18} {"name":"zs","age":16} {"name":"lili","age":16} {"name":"abc xyz","age":15}
filter 过滤
.setPostFilter(QueryBuilders.rangeQuery("age").from("16").to(20))过滤出来年龄在16到20之间的 {"name":"jessic","age":18} {"name":"zs","age":16} {"name":"jack","age":19} {"name":"lili","age":16} {"name":"tom","age":19}
highlight 高亮 将搜索出的结果加上高亮的效果
按查询匹配度排序
- .setExplain(true)
两个简单练习
聚合分组求count
/*** 统计测试* 聚合分组求count*/public static void testAggregation(TransportClient client){SearchResponse searchResponse = client.prepareSearch(index)//.setTypes(type).setQuery(QueryBuilders.matchAllQuery()).addAggregation(AggregationBuilders.terms("term_age").field("age")).get();Terms term_age = searchResponse.getAggregations().get("term_age");List<? extends Terms.Bucket> buckets = term_age.getBuckets();for (Terms.Bucket bk:buckets) {System.out.println(bk.getKey()+"----------"+bk.getDocCount());}}
聚合分组求sum
/*** 统计测试* 聚合分组求sum*/public static void testAggregation2(TransportClient client){SearchResponse searchResponse = client.prepareSearch(index).setQuery(QueryBuilders.matchAllQuery()).addAggregation(AggregationBuilders.terms("term_name").field("name.keyword") //name是text类型不支持分组,所以取他的keyword.subAggregation(AggregationBuilders.sum("sum_score").field("score"))).get();Terms term_name = searchResponse.getAggregations().get("term_name");List<? extends Terms.Bucket> buckets = term_name.getBuckets();for (Terms.Bucket bk:buckets) {Sum sumScore = bk.getAggregations().get("sum_score");System.out.println(bk.getKey()+"----------"+sumScore.getValue());}}
Elasticsearch中的setting以及mapping详解
setting是修改索引库默认的配置
查看页面的setting信息
- curl -XGET http://localhost:9200/test/_settings?pretty
修改已经存在的索引库信息
curl -H "Content-Type: application/json" -XPUT 'localhost:9200/test/_settings' -d'{"index":{"number_of_replicas":1}}'
修改不存在的索引库的信息
curl -H "Content-Type: application/json" -XPUT 'localhost:9200/test1/' -d'{"settings":{"number_of_shards":3,"number_of_replicas":0}}'
mapping 是对索引库中的索引的名称以及数据类型进行定义,类似于MySQL的表名以及表的结构信息。但是es的mapping比较灵活,可以动态识别各字段的信息,一般不需要自定义mapping
查看索引库mapping信息
curl -XGET http://localhost:9200/test/emp/_mapping?pretty
操作已经存在的索引 指定分词器
curl -H "Content-Type: application/json" -XPOST http://localhost:9200/test/emp/_mapping -d'{"properties":{"name":{"type":"text","analyzer": "ik_max_word"}}}'
操作不存在的索引
curl -H "Content-Type: application/json" -XPUT 'localhost:9200/test2' -d'{"mappings":{"emp":{"properties":{"name":{"type":"text","analyzer": "ik_max_word"}}}}}'
Elasticsearch的分片查询方式
- 默认的是randomize across shards 表示随机选取,即随机从分片中取数据
- _local :表示执行查询操作的时候回优先在本地节点中的分片中进行查询,没有的话在去其他节点
- _only_local:表示只在本地分片中查询
- _primary:表示只在主分片中查询
- _primary_first:表示优先在主分片中查询,如果主分片出现问题数据丢失或者其他就会去副分片中查询
- _replica_first:表示优先在副分片上查询,有问题了再去主分片查询
- _only_node:在指定ID的节点上查询,只有该节点上有相关分片就回进行查询,可能导致查询结果不够完整
- _only_nodes:指定ID的节点是多个
- _prefer_node:优先在指定ID的节点查询 查不到再去其他节点
- _shards:查询指定分片的信息 可以实现急速查询 但需要指定索引所在分片的信息
Elasticsearch高级二相关推荐
- Elasticsearch 学习(二).实战使用
Elasticsearch 学习(二).实战使用 参考:http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elastic ...
- elasticsearch高级搜索功能多维度分享
目录 一.业务搜索核心功能 二.高级搜索匹配功能 三.搜索排序功能 elasticsearch高级搜索功能多维度分享,这也是实战的比较之路,此次我们全面分享常用的业务情景,全覆盖功能分享,让大家有一览 ...
- Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)(示例代码)
简介 这篇文章主要介绍了Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)(示例代码)以及相关的经验技巧,文章约21106字,浏览量320,点赞数5,值得参考! ...
- 【Elasticsearch】Elasticsearch高级调优方法论之——根治慢查询!
1.概述 转载:Elasticsearch高级调优方法论之--根治慢查询! 1.引言 Elasticsearch是非常灵活且功能丰富的搜索引擎,它提供了许多不同查询数据的方法.在实战业务场景中,经常会 ...
- ElasticSearch 高级查询语法
ElasticSearch 高级查询语法Query DSL ES倒排索引 ES高级查询Query DSL 查询所有 match_all 分页查询form 深分页查询Scroll 指定字段排序sort ...
- javaScript高级[二]
javaScript高级[二] 函数 函数的定义和调用 函数的定义方式 函数的调用方式 this 函数内this指向 改变函数内部this指向 call()方法 apply()方法 bind()方法 ...
- ElasticSearch 高级
ElasticSearch 高级 今日目标: ElasticSearch 高级操作 ElasticSearch 集群管理 1 ElasticSearch查询 ElasticSearch的强大之处就在于 ...
- ElasticSearch高级 (Query DSL查询 bulk批量操作 导入数据 各种查询 实战技巧-优化比重 全量与增量数据同步)
ElasticSearch高级 01-Query DSL(Domain Specific Language) 1 查询上下文 2 相关度评分:_score 3 元数据:_source 4 Query ...
- ElasticSearch二 ElasticSearch高级用法
一 文档批量操作 这里多个文档是指,批量操作多个文档,搜索查询文档将在之后的章节讲解 1.1 批量获取文档数据 批量获取文档数据是通过_mget的API来实现的 1.1.1 在URL中不指定index ...
最新文章
- Centos中文输入法安装以及切换
- 【轻松一刻】计算公式:为什么我们都是猪
- php strip_tags 少,详解PHP函数 strip_tags的用法不足之处
- 转:Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- luogu2756 飞行员配对方案问题 (裸匈牙利)
- 2010伊始就这么忙
- hdfs读写流程_一篇文章搞清楚 HDFS 基本原理
- v-for key的作用
- m_pRecordset-Open
- 如何在Axure使用iconfont图标库里的图标
- 20160213为王伟写的挪点号,也可以叫它为文字避让
- css样式给标签加上小手图标
- 十分钟用Django创建一个简单的职位管理系统
- HDMI转PGA电脑没有声音处理方法
- 微信小程序:关注公众号组件自定义样式
- H5微信公众号关闭页面
- 皮卡智能2022年功能升级汇总,打造智能工作新体验
- Win10 通过重置来修复系统的方法
- 产品周报第29期|创作中心优化:发文助手新增质量分检测功能,博文增加内容历史版本
- int *a和(int *)a的区别
热门文章
- Vue EventBus事件侦听($on、$emit、$off、$once)
- 在Xcode中进行自动化测试
- 信息安全导论复习(1-5章)
- 请检查您计算机的网络连接状态,Win10玩lol英雄联盟无法连接服务器请检查您的网络连接解决方法...
- Android常见绕过屏锁小技巧汇总
- GBase 8c V3.0.0数据类型——货币类型
- 语音前处理技术在会议场景中的应用及挑战
- php序列化绕过wakeup,PHP反序列化漏洞#XCTF题 : unserialize3#绕过wakeup()函数
- 劳务资质怎么办?劳务公司怎么办理?劳务资质备案在哪里备案
- RISK-V品牌的中国化历程(上)