栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

ElasticSearch 排序 分页

ElasticSearch 排序 分页

基于kibana 查询 字段非空查询

查询某个字段的值不等于空字符串

GET aunt/aunt_type/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "term": {
            "auntUserId": {
              "value": ""
            }
          }
        }
      ]
    }
  }
}
反向查询(must_not)
GET /test2/product/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "age": 20
          }
        }
        ,{
          "match": {
            "name": "test11"
          }
        }
      ]
    }
  }
}

字段排序查询
GET /test2/product/_search
{
  "query": {
    "match": {
      "name": "test"
    } 
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

分页排序查询
GET /test2/product/_search
{
  "query": {
    
    "match": {
      "name": "test"
    }
    
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  #从第几条开始
  "from": 0,
  #获取几条数据
  "size": 2
  #from + size其实就是limit from,size
  
}
or多条件查询,是否存在(返回boolean值)
GET /test2/product/_search
{
  "query": {
    "bool": {
    #must的两个条件都必须满足,即mysql中的and
    #should的两个条件至少满足一个就可以。即mysql中的or
      "must": [
        {
          "match": {
            "name": "test"
          }
        },
        {
          "match": {
            "age": 20
          }
        }
      ]
    }
  }
}

条件过滤(范围查询)
GET /test2/product/_search
{
  "query": {
    "bool": {
    "must": [
        {
          "match": {
            "name": "test"
          }
        }
      ], 
      "filter": {
        "range": {
          "age": {
          #gte >=
          #lte <=
          #lt <
          #gt >
            "gte": 10,
            "lte": 19
          }
        }
      }
    }
  }
}

某字段多值查询(in查询)

多个值需要空格分隔

GET /test2/product/_search
{
  "query": {
    
    "match": {
      "name": "test 111111"
    }
    
  }
}
基于Java 代码查询
matchAllQuery匹配所有文档
queryStringQuery基于Lucene的字段检索
wildcardQuery通配符查询匹配多个字符,?匹配1个字符*
termQuery词条查询
matchQuery字段查询
idsQuery标识符查询
fuzzyQuery文档相似度查询
includeLower includeUpper范围查询
boolQuery组合查询(复杂查询)
SortOrder排序查询

' ​

1 查询所有

matchAllQuery()匹配所有文件

match_all查询是Elasticsearch中最简单的查询之一。它使我们能够匹配索引中的所有文件。

@Test
public void searchAll(){
    SearchResponse searchResponse = client.prepareSearch("sanguo")
           .setTypes("dahan").setQuery(QueryBuilders.matchAllQuery())
           .get();
 ​// 获取命中次数,查询结果有多少对象
    SearchHits hits = searchResponse.getHits(); 
    System.out.println("查询结果" + hits.getTotalHits() + "条");
    Iterator iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
        System.out.println("===============================================");
   }
}
​
​
2 解析查询字符串

相比其他可用的查询,query_string查询支持全部的Apache Lucene查询语法

针对多字段的query_string查询

@Test
public void query_String(){
    SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
           .setQuery(QueryBuilders.queryStringQuery("孙尚香")).get();
    SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
    Iterator iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
        System.out.println("===============================================");
   }
}
​
3 通配符查询(wildcardQuery)

*匹配多个字符,?匹配1个字符

注意:避免* 开始, 会检索大量内容造成效率缓慢

@Test
public void wildcardQuery(){
    SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
           .setQuery(QueryBuilders.wildcardQuery("address", "广东*")).get();
    SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
   
    Iterator iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
      
        System.out.println("===============================================");
   }
}
​
4 词条查询(termQuery)

词条查询是Elasticsearch中的一个简单查询。它仅匹配在给定字段中含有该词条的文档,而且是确切的、未经分析的词条

termQuery("key", obj) 完全匹配

termsQuery("key", obj1, obj2..)

一次匹配多个值,有一个值是正确的,就可以查询出数据

@Test
public void termQuery(){
    SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
           .setQuery(QueryBuilders.termsQuery("name", "张飞","刘备","关羽")).get(); 
    // 获取命中次数,查询结果有多少对象
    SearchHits hits = searchResponse.getHits();
    Iterator iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
        
        System.out.println("===============================================");
   }
}
​
5 字段匹配查询

match**查询把query参数中的值拿出来,加以分析,然后构建相应的查询**。使用match查询时,Elasticsearch将对一个字段选择合适的分析器,所以可以确定,传给match查询的词条将被建立索引时相同的分析器处理。

@Test
public void MatchQuery(){
    SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
 .setQuery(QueryBuilders.matchQuery("address", " 上海")).get();
    SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
    System.out.println("查询结果有:" + hits.getTotalHits() + "条");
    Iterator iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
        
        System.out.println("===============================================");
   }
​
​
}
 

Matchquery 和termquery的区别:

match:匹配的时候,会将查询的关键字进行分词,然后根据分词后的结果进行查询。
term:直接使用关键字进行查询,不对关键字进行分词。
multiMatchQuery("text", "field1", "field2"..); 匹配多个字段

mutilMatchQuery:


@Test
public void mutileMatchQuery(){
    SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
           .setQuery(QueryBuilders.multiMatchQuery("北京", "address","name")).get();
    // 获取命中次数,查询结果有多少对象    
    SearchHits hits = searchResponse.getHits(); 
  
    Iterator iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
       
        System.out.println("===============================================");
   }
}
​
​
6 只查询ID(标识符查询)

标识符查询是一个简单的查询,仅用提供的标识符来过滤返回的文档。

@Test
public void idsQuery() {
    SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
           .setQuery(QueryBuilders.idsQuery().addIds("AWNkQSCJzU0_wTuf7egi")).get();
    SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
   
    Iterator iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
      
        System.out.println("===============================================");
   }
}
​
​
7 相似度查询

插入两条测试数据:

PUT /tt1/doc1/123
{
  "name": "曹操",
  "male" : "男", 
  "age" : 40 , 
  "birthday" : "1975-02-03" , 
  "classNo" : 1 , 
  "address" : "海淀区坐落于北京市" , 
  "isLeader" : true
}
​
PUT /tt1/doc1/234
{
  "name": "董卓",
  "male" : "男", 
  "age" : 35 , 
  "birthday" : "1975-02-03" , 
  "classNo" : 1 , 
  "address" : "北京it程序员" , 
  "isLeader" : true
}
​

fuzzy查询是模糊查询中的第三种类型,它基于编辑距离算法来匹配文档

@Test
public void fuzzyQuery(){
    SearchResponse searchResponse = client.prepareSearch("tt1").setTypes("doc1")
           .setQuery(QueryBuilders.fuzzyQuery("address", "北京市")).get();
    SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
    System.out.println("查询结果有:" + hits.getTotalHits() + "条");
    Iterator iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
       
        System.out.println("===============================================");
   }
}
​
8 范围查询

范围查询使我们能够找到在某一字段值在某个范围里的文档,字段可以是数值型,也可以是

基于字符串的

includeLower(true):包含上界

IncludeUpper(true):包含下界


@Test
public void rangeQuery(){
    SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
           .setQuery(QueryBuilders.rangeQuery("age").from(18).to(22) 
                   .includeLower(true)
                   .includeUpper(false))
           .get();
    SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
    Iterator iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
       
        System.out.println("===============================================");
   }
}

​ ​

9 组合查询(复杂查询)
must(QueryBuilders) : AND
mustNot(QueryBuilders): NOT
should(QueryBuilders):OR 

插入一条数据:

PUT /tt1/doc1/345
{
  "name": "貂蝉",
  "male" : "女", 
  "age" : 16 , 
  "birthday" : "2000-02-03" , 
  "classNo" : 1 , 
  "address" : "北京市女it程序员" , 
  "isLeader" : true
}

  
  @Test
  public void boolQuery(){
      SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
             .setQuery(QueryBuilders.boolQuery()
                     .must(QueryBuilders.matchQuery("address", "程序员"))
                     .must(QueryBuilders.termQuery("male", "女"))).get();
      SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
      Iterator iterator = hits.iterator();
      while (iterator.hasNext()) {
          SearchHit next = iterator.next();
         
          System.out.println("===============================================");
     }
 }
​
​
10 排序查询
@Test
public void SortOrderQuery(){
    SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
           .setQuery(QueryBuilders.matchAllQuery())
           .addSort("age", SortOrder.ASC).get();
    SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
    Iterator iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
      
        System.out.println("===============================================");
   }
}

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/283051.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号