Elasticsearch操作笔记

排序相关:

GET people/_search

{
    "query":{
        "match":{
            "name":"zhangsan"
        }
    },
    "sort":[
        {
        	"price":{
                "order":"desc"
            }
    	}
    ]
}

在查询后,加一个集合,sort,即可指定排序规则,即排序的属性,顺序或者倒叙

java代码相关实现查询排序:

sourceBuilder.sort("price", SortOrder.ASC).sort("a",SortOrder.ASC);
//链式编程,可以加排序规则

文档操作

//根据id查询文档
        GetRequest getRequest = new GetRequest("people","id");
        GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
        String sourceAsString = documentFields.getSourceAsString();

//新增或者修改文档
        Object o = new Object();
        String s = JSON.toJSONString(o);
        IndexRequest indexRequest= new IndexRequest("索引名称").id("asd").source(s, XContentType.JSON);
        IndexResponse index = client.index(indexRequest, RequestOptions.DEFAULT);

        //删除文档
        DeleteRequest deleteRequest= new DeleteRequest("索引名称","id");
        DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT);

matchAll查询:

查询所有文档

  1. http://192.168.23.129:9200/people/_doc /索引名/_doc 默认查询所有

  2. JAVA API操作:

     //构造查询请求对象,构造方法参数为索引名称
            SearchRequest searchRequest = new SearchRequest("people");
    
            //查询条件构造器
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    
            //指定查询条件
            QueryBuilder query = QueryBuilders.matchAllQuery();
    
            sourceBuilder.query(query);
    
            searchRequest.source(sourceBuilder);
    
    
            SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
    
            SearchHits hits = search.getHits();
            TotalHits totalHits = hits.getTotalHits();
    
            long value = totalHits.value;
            System.out.println(value);
            SearchHit[] hits1 = hits.getHits();
    
            for (SearchHit s :hits1){
                String sourceAsString = s.getSourceAsString();
                System.out.println(sourceAsString);
    
            }
    

    总结:其实有一个嵌套过程。由client发起请求,需要传入searchrequest,searchrequest中需要传入sourceBuilder,这个builder可以用query方法指定各种查询方法,然后指定各种参数。sourcebuilder中还可以添加分页信息

term查询:

词条查询,不会对查询条件进行分词

match查询:

分值后的等值匹配

脚本操作-1:
GET people/_search

{
    "query":{
        "match":{
            "name":"zhangsan"
        }
    }
}
脚本操作-2
GET people/_search

{
    "query":{
        "match":{
            "name":{
                "query":"lisi",
                "operator":"and" --这里默认为 or,即分词后与不分词取并集,and意思是取交集
            }
        }
    }
}
JAVA-API操作:
@Test
    public void matchQuery() throws IOException {
        //构造查询请求对象,构造方法参数为索引名称
        SearchRequest searchRequest = new SearchRequest("people");

        //查询条件构造器
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //指定查询条件
        MatchQueryBuilder query = QueryBuilders.matchQuery("key", "val");
        query.operator(Operator.OR);//指定交集或者并集
        sourceBuilder.query(query);
        searchRequest.source(sourceBuilder);
        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        TotalHits totalHits = hits.getTotalHits();
        long value = totalHits.value;
        System.out.println(value);
        SearchHit[] hits1 = hits.getHits();

        for (SearchHit s :hits1){
            String sourceAsString = s.getSourceAsString();
            System.out.println(sourceAsString);

        }
    }

模糊查询-wildcard查询:

对查询条件分词后,进行模糊匹配

脚本操作:
GET people/_search

{
    "query":{
        "wildcard":{
            "name":{
                "value":"李*"  ---以李开头,?01,*,多个
            }
        }
    }
}
JAVA -API操作:
//构造查询请求对象,构造方法参数为索引名称
        SearchRequest searchRequest = new SearchRequest("people");

        //查询条件构造器
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //指定查询条件
        WildcardQueryBuilder query = QueryBuilders.wildcardQuery("name", "李*");

        sourceBuilder.query(query);
        searchRequest.source(sourceBuilder);

        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        TotalHits totalHits = hits.getTotalHits();
        long value = totalHits.value;
        System.out.println(value);
        SearchHit[] hits1 = hits.getHits();

        for (SearchHit s :hits1){
            String sourceAsString = s.getSourceAsString();
            System.out.println(sourceAsString);

        }

模糊查询-正则查询

正则查询

脚本操作:
GET people/_search

{
    "query":{
        "regexp":{
            "name":"\\w+(.)*"  --搜索正则即可
        }
    }
}
JAVA-API操作:
//构造查询请求对象,构造方法参数为索引名称
        SearchRequest searchRequest = new SearchRequest("people");

        //查询条件构造器
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //指定查询条件
        RegexpQueryBuilder query = QueryBuilders.regexpQuery("name", "李*");

        sourceBuilder.query(query);
        searchRequest.source(sourceBuilder);

        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        TotalHits totalHits = hits.getTotalHits();
        long value = totalHits.value;
        System.out.println(value);
        SearchHit[] hits1 = hits.getHits();

        for (SearchHit s :hits1){
            String sourceAsString = s.getSourceAsString();
            System.out.println(sourceAsString);

        }

模糊查询-前缀查询:

前缀查询

脚本操作:
GET people/_search

{
    "query":{
        "prefix":{
            "name":{
                "value":"李四"   --查询以李四开头的,貌似会把空格后的数据算上
            }
        }
    }
}
JAVA-API操作:
//构造查询请求对象,构造方法参数为索引名称
        SearchRequest searchRequest = new SearchRequest("people");

        //查询条件构造器
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //指定查询条件
        PrefixQueryBuilder query = QueryBuilders.prefixQuery("name", "李");
        
        sourceBuilder.query(query);
        searchRequest.source(sourceBuilder);

        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        TotalHits totalHits = hits.getTotalHits();
        long value = totalHits.value;
        System.out.println(value);
        SearchHit[] hits1 = hits.getHits();

        for (SearchHit s :hits1){
            String sourceAsString = s.getSourceAsString();
            System.out.println(sourceAsString);

        }

范围查询:

范围查询

脚本操作:
GET people/_search

{
    "query":{
        "range":{
            "name":{
                "gte":2000,  --最小值
                "lte":3000	--最大值
            }
        }
    }
}
JAVA-API操作:
    @Test
    public void rangeSearch() throws IOException {
        //构造查询请求对象,构造方法参数为索引名称
        SearchRequest searchRequest = new SearchRequest("people");

        //查询条件构造器
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //指定查询条件,指定查询词缀
        RangeQueryBuilder query = QueryBuilders.rangeQuery("price");

        query.gte(2000);//下限
        query.lte(3000);//上线

        sourceBuilder.query(query);
        searchRequest.source(sourceBuilder);

        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        TotalHits totalHits = hits.getTotalHits();
        long value = totalHits.value;
        System.out.println(value);
        SearchHit[] hits1 = hits.getHits();

        for (SearchHit s :hits1){
            String sourceAsString = s.getSourceAsString();
            System.out.println(sourceAsString);

        }
    }

queryString查询

描述:

​ 可以指定多个字段进行查询一个特定值.例如查询:李,可以从指定从name中查,还可以同时指定在addr中查询

脚本操作:
#GET people/_search

{
    "query":{
        "query_string":{
            "fields":["name","addr","age"],
            "query":"李 AND 四"  #OR,自定义分词,AND,强制合并不分词
        }
    }
}
# 第二种操作方式
{
    "query":{
        "simple_query_string":{
            "fields":["name","addr","age"],
            "query":"李 AND 四"  #自定义的ORAND不起作用,视为一个普通词
        }
    }
}

java-api 操作
//构造查询请求对象,构造方法参数为索引名称
        SearchRequest searchRequest = new SearchRequest("people");

        //查询条件构造器
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //指定查询条件,指定查询词缀
        QueryStringQueryBuilder query = QueryBuilders.queryStringQuery("李").field("name").field("addr").defaultOperator(Operator.AND);


        sourceBuilder.query(query);
        sourceBuilder.sort("price", SortOrder.ASC).sort("a",SortOrder.ASC);

        searchRequest.source(sourceBuilder);

        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        TotalHits totalHits = hits.getTotalHits();
        long value = totalHits.value;
        System.out.println(value);
        SearchHit[] hits1 = hits.getHits();

        for (SearchHit s :hits1){
            String sourceAsString = s.getSourceAsString();
            System.out.println(sourceAsString);

        }

布尔查询

描述:

​ 可以对多个查询进行连接查询

查询分类:
  1. must查询:条件必须成立(and)
  2. must_not:条件必须不成立(not)
  3. should:条件可以成立
  4. filter:条件必须成立,比must性能好,去掉了得分
脚本操作:
#GET people/_search
{
    "query":{
        "bool":{
            "must":[{}],
            "filter":[{}],
            "must_not":[{}],
            "should":[{}]
        }
    }
}
#示例:
{
    "query":{
        "bool":{
            "must":[{
                "term":{
                    "brand":{
                        "value":"华为"
                    }
                }
            }],
            "filter":[{
                "range":{
            		"name":{
                		"gte":2000,  --最小值
                		"lte":3000	--最大值
            		}
        		}
            }],
            "must_not":[{}],
            "should":[{}]
        }
    }
}
JAVA-API操作:
@Test
    public void boolQuery() throws IOException {
        //构造查询请求对象,构造方法参数为索引名称
        SearchRequest searchRequest = new SearchRequest("people");

        //查询条件构造器
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //指定查询条件,指定查询词缀
        BoolQueryBuilder query = QueryBuilders.boolQuery();

        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("a", "b");
        query.must(termQueryBuilder);

        RangeQueryBuilder price = QueryBuilders.rangeQuery("price");
        price.gte(2000);
        price.lte(3000);
        query.should(price);
        sourceBuilder.query(query);
        sourceBuilder.sort("price", SortOrder.ASC).sort("a",SortOrder.ASC);

        searchRequest.source(sourceBuilder);

        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        TotalHits totalHits = hits.getTotalHits();
        long value = totalHits.value;
        System.out.println(value);
        SearchHit[] hits1 = hits.getHits();

        for (SearchHit s :hits1){
            String sourceAsString = s.getSourceAsString();
            System.out.println(sourceAsString);

        }
    }

解释:其实就是构造一个boolquery对象,将别的查询对象放进取即可

聚合查询:

描述:
  1. 指标聚合:mysql中的聚合函数,max,min,avg,sum等
  2. 桶聚合:相当于mysql中的group by聚合,不能对text类型进行分组,会失败
脚本操作:
#GET people/_search

#指标聚合:
{
    "query":{
        "match":{
            "name":"张三"
        }
    },
    "aggs":{
        "NAME":{	#此处的NAME是聚合查询后,将聚合结果封装的key,可以自定义
            "max":{
                "field":"price"
            }
        }
    }
}

#桶聚合
{
    "query":{
        "match":{
            "name":"张三"
        }
    },
    "aggs":{
        "NAME":{	#此处的NAME是聚合查询后,将聚合结果封装的key,可以自定义
            "terms":{ 	#terms表示分组操作
                "field":"price",
                "size":200
            }
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值