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高级二相关推荐

  1. Elasticsearch 学习(二).实战使用

    Elasticsearch 学习(二).实战使用 参考:http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elastic ...

  2. elasticsearch高级搜索功能多维度分享

    目录 一.业务搜索核心功能 二.高级搜索匹配功能 三.搜索排序功能 elasticsearch高级搜索功能多维度分享,这也是实战的比较之路,此次我们全面分享常用的业务情景,全覆盖功能分享,让大家有一览 ...

  3. Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)(示例代码)

    简介  这篇文章主要介绍了Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)(示例代码)以及相关的经验技巧,文章约21106字,浏览量320,点赞数5,值得参考! ...

  4. 【Elasticsearch】Elasticsearch高级调优方法论之——根治慢查询!

    1.概述 转载:Elasticsearch高级调优方法论之--根治慢查询! 1.引言 Elasticsearch是非常灵活且功能丰富的搜索引擎,它提供了许多不同查询数据的方法.在实战业务场景中,经常会 ...

  5. ElasticSearch 高级查询语法

    ElasticSearch 高级查询语法Query DSL ES倒排索引 ES高级查询Query DSL 查询所有 match_all 分页查询form 深分页查询Scroll 指定字段排序sort ...

  6. javaScript高级[二]

    javaScript高级[二] 函数 函数的定义和调用 函数的定义方式 函数的调用方式 this 函数内this指向 改变函数内部this指向 call()方法 apply()方法 bind()方法 ...

  7. ElasticSearch 高级

    ElasticSearch 高级 今日目标: ElasticSearch 高级操作 ElasticSearch 集群管理 1 ElasticSearch查询 ElasticSearch的强大之处就在于 ...

  8. ElasticSearch高级 (Query DSL查询 bulk批量操作 导入数据 各种查询 实战技巧-优化比重 全量与增量数据同步)

    ElasticSearch高级 01-Query DSL(Domain Specific Language) 1 查询上下文 2 相关度评分:_score 3 元数据:_source 4 Query ...

  9. ElasticSearch二 ElasticSearch高级用法

    一 文档批量操作 这里多个文档是指,批量操作多个文档,搜索查询文档将在之后的章节讲解 1.1 批量获取文档数据 批量获取文档数据是通过_mget的API来实现的 1.1.1 在URL中不指定index ...

最新文章

  1. Centos中文输入法安装以及切换
  2. 【轻松一刻】计算公式:为什么我们都是猪
  3. php strip_tags 少,详解PHP函数 strip_tags的用法不足之处
  4. 转:Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
  5. luogu2756 飞行员配对方案问题 (裸匈牙利)
  6. 2010伊始就这么忙
  7. hdfs读写流程_一篇文章搞清楚 HDFS 基本原理
  8. v-for key的作用
  9. m_pRecordset-Open
  10. 如何在Axure使用iconfont图标库里的图标
  11. 20160213为王伟写的挪点号,也可以叫它为文字避让
  12. css样式给标签加上小手图标
  13. 十分钟用Django创建一个简单的职位管理系统
  14. HDMI转PGA电脑没有声音处理方法
  15. 微信小程序:关注公众号组件自定义样式
  16. H5微信公众号关闭页面
  17. 皮卡智能2022年功能升级汇总,打造智能工作新体验
  18. Win10 通过重置来修复系统的方法
  19. 产品周报第29期|创作中心优化:发文助手新增质量分检测功能,博文增加内容历史版本
  20. int *a和(int *)a的区别

热门文章

  1. Vue EventBus事件侦听($on、$emit、$off、$once)
  2. 在Xcode中进行自动化测试
  3. 信息安全导论复习(1-5章)
  4. 请检查您计算机的网络连接状态,Win10玩lol英雄联盟无法连接服务器请检查您的网络连接解决方法...
  5. Android常见绕过屏锁小技巧汇总
  6. GBase 8c V3.0.0数据类型——货币类型
  7. 语音前处理技术在会议场景中的应用及挑战
  8. php序列化绕过wakeup,PHP反序列化漏洞#XCTF题 : unserialize3#绕过wakeup()函数
  9. 劳务资质怎么办?劳务公司怎么办理?劳务资质备案在哪里备案
  10. RISK-V品牌的中国化历程(上)