Es之java各种查询操作

Es之java各种查询操作

matchAllQuery 匹配所有文档
queryStringQuery 基于Lucene的字段检索
wildcardQuery 通配符查询匹配多个字符,?匹配1个字符*
termQuery 词条查询
matchQuery 字段查询
idsQuery 标识符查询
fuzzyQuery 文档相似度查询
includeLower includeUpper 范围查询
boolQuery 组合查询(复杂查询)
SortOrder 排序查询

插入样例数据:

curl -XPOST http://hadoop01:9200/sanguo/dahan/_bulk -d '
{ "index": {}}    
{ "studentNo" : 1, "name" : "刘备", "male" : "男", "age" : 24 , "birthday" : "1985-02-03" , "classNo" : 1 , "address" : "湖南省长沙市" , "isLeader" : true}
{ "index": {}}            
{ "studentNo" : 2, "name" : "关羽", "male" : "男", "age" : 22 , "birthday" : "1987-08-23" , "classNo" : 2, "address" : "四川省成都市" , "isLeader" : false}
{ "index": {}}                                 
{ "studentNo" : 3, "name" : "糜夫人", "male" : "女", "age" : 19 , "birthday" : "1990-06-12" , "classNo" : 1 , "address" : "上海市" , "isLeader" : false}
{ "index": {}}
{ "studentNo" : 4, "name" : "张飞", "male" : "男", "age" : 20 , "birthday" : "1989-07-30" , "classNo" : 3 , "address" : "北京市" , "isLeader" : false}
{ "index": {}}
{ "studentNo" : 5, "name" : "诸葛亮", "male" : "男", "age" : 18 , "birthday" : "1992-04-27" , "classNo" : 2 , "address" : "江苏省南京市" , "isLeader" : true}
{ "index": {}}     
{ "studentNo" : 6, "name" : "孙尚香", "male" : "女", "age" : 16 , "birthday" : "1994-05-21" , "classNo" : 3 , "address" : "广东省深圳市" , "isLeader" : false}
{ "index": {}}              
{ "studentNo" : 7, "name" : "马超", "male" : "男", "age" : 19 , "birthday" : "1991-10-20" , "classNo" : 1 , "address" : "黑龙江省哈尔滨市" , "isLeader" : false}
{ "index": {}}                        
{ "studentNo" : 8, "name" : "赵云", "male" : "男", "age" : 23 , "birthday" : "1986-10-26" , "classNo" : 2 , "address" : "浙江省杭州市" , "isLeader" : false}
'

基础查询操作

1:查询所有

matchAllQuery()匹配所有文件

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

/**
 *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<SearchHit> iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
        System.out.println("name : "+ next.getSource().get("name"));
        System.out.println("studentNo : "+ next.getSource().get("studentNo"));
        System.out.println("male : "+ next.getSource().get("male"));
        System.out.println("birthday : "+ next.getSource().get("birthday"));
        System.out.println("classNo : "+ next.getSource().get("classNo"));
        System.out.println("address : "+ next.getSource().get("address"));
        System.out.println("===============================================");
    }
}

2:解析查询字符串

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

针对多字段的query_string查询

/**
 * 相比其他可用的查询,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(); // 获取命中次数,查询结果有多少对象
    System.out.println("查询结果有:" + hits.getTotalHits() + "条");
    Iterator<SearchHit> iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
        System.out.println("name : "+ next.getSource().get("name"));
        System.out.println("studentNo : "+ next.getSource().get("studentNo"));
        System.out.println("male : "+ next.getSource().get("male"));
        System.out.println("birthday : "+ next.getSource().get("birthday"));
        System.out.println("classNo : "+ next.getSource().get("classNo"));
        System.out.println("address : "+ next.getSource().get("address"));
        System.out.println("===============================================");
    }
}

3:通配符查询(wildcardQuery)

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

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

/**
 * *匹配多个字符,?匹配1个字符
 注意:避免* 开始, 会检索大量内容造成效率缓慢
 * */
@Test
public void wildcardQuery(){
    SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
            .setQuery(QueryBuilders.wildcardQuery("address", "广东*")).get();
    SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
    System.out.println("查询结果有:" + hits.getTotalHits() + "条");
    Iterator<SearchHit> iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit next = iterator.next();
        System.out.println("name : "+ next.getSource().get("name"));
        System.out.println("studentNo : "+ next.getSource().get("studentNo"));
        System.out.println("male : "+ next.getSource().get("male"));
        System.out.println("birthday : "+ next.getSource().get("birthday"));
        System.out.println("classNo : "+ next.getSource().get("classNo"));
        System.out.println("address : "+ next.getSource().get("address"));
        System.out.println("===============================================");
    }
}

4:词条查询(termQuery)

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

termQuery(“key”, obj) 完全匹配

termsQuery(“key”, obj1, obj2…)

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

/**
 * 词条查询是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(); // 获取命中次数,查询结果有多少对象
    System.out.println("查询结果有:" + hits.
  • 40
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java 查询 ES 数据可以使用 ElasticsearchJava 客户端 API,该 API 封装了 ES 的各种查询操作,包括: 1. Term Query:根据关键词进行查询。 2. Match Query:根据匹配进行查询。 3. Range Query:根据范围进行查询。 4. Wildcard Query:根据通配符进行查询。 5. Fuzzy Query:根据模糊匹配进行查询。 6. Bool Query:使用布尔运算符进行组合查询。 7. Filter Query:使用过滤器进行查询。 8. Aggregation:使用聚合操作进行查询分析。 下面是一个示例代码,演示了如何使用 Java 客户端 API 进行 Term Query 查询: ``` // 创建 ES 客户端 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); // 构建 Term Query 查询 QueryBuilder queryBuilder = QueryBuilders.termQuery("name", "John"); // 构建 SearchRequest SearchRequest searchRequest = new SearchRequest("index_name"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(queryBuilder); searchRequest.source(sourceBuilder); // 执行查询 SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); // 处理查询结果 SearchHits hits = response.getHits(); for (SearchHit hit : hits) { Map<String, Object> sourceAsMap = hit.getSourceAsMap(); System.out.println(sourceAsMap); } // 关闭 ES 客户端 client.close(); ``` 以上代码中,我们使用了 Term Query 进行查询查询条件为 name 字段等于 John。构建查询条件后,我们使用 SearchRequest 构建查询请求,指定查询的索引、查询条件等信息。然后使用 ES 客户端执行查询,并处理查询结果。最后记得关闭 ES 客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lovesais

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值