草庐IT

ES条件查询

蜗个牛儿 2025-05-12 原文

matchAll分页查询

 @Test
    public void testMatchAll() throws IOException {

        //创建查询请求对象
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询条件(分页,查询所有)
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery()); //
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(15);
 
        //请求对象设置
        searchRequest.source(searchSourceBuilder);

        //开始查询
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印查询结果
        SearchHits searchHits = response.getHits();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(sourceStr, Goods.class);
            System.out.println("hitDetail = " + goods);
        }

    }

termQuery词条查询

@Test
    public void testTermQuery() throws IOException {

        //创建查询请求对象
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询条件(termQuery)
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.termQuery("title", "华为"));

        //请求对象
        searchRequest.source(searchSourceBuilder);

        //看是同步查询
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        List<Goods> list = new ArrayList<>();
        SearchHits hits = searchResponse.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String jsonStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(jsonStr, Goods.class);
            list.add(goods);
            System.out.println("goods = " + goods);
        }
        System.out.println("list = " + list);
    }

//分词查询

  @Test
    public void testMatchQuery() throws IOException {

        //创建查询请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        MatchQueryBuilder query = QueryBuilders.matchQuery("title","华为手机");
        query.operator(Operator.OR); //必须,华为,手机都有, 默认为OR(包含华为,或则手机)
        searchSourceBuilder.query(query);

        //付值查询条件
        searchRequest.source(searchSourceBuilder);

        //查询
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        SearchHits hits = response.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String hisStr = hit.getSourceAsString();
            Goods one = JSON.parseObject(hisStr, Goods.class);
            System.out.println("one = " + one);
        }
    }

/**
* 模糊查询?代表任意一个字符,*代表任意n个字符
* wildcard
*/

 @Test
    public void  testWildcarQuery() throws IOException {

        //创建请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.wildcardQuery("title","华*"));
        searchRequest.source(searchSourceBuilder);
        
        //开始查询
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        
        //打印
        SearchHits hits = response.getHits();
        System.out.println("总记录数 = " + hits.getTotalHits().value);
        
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String sourceString = hit.getSourceAsString();
            Goods goods = JSON.parseObject(sourceString, Goods.class);
            System.out.println("goods = " + goods);
        }
    }

/**
* 模糊查询:perfixQuery
*/

@Test
    public void testPrefixQuery() throws IOException {

        //创建查询请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建请求条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.prefixQuery("brandName","三"));
        searchRequest.source(searchSourceBuilder);

        //开始查询
        SearchResponse respose = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        SearchHits hits = respose.getHits();

        System.out.println("总记录数 = " + hits.getTotalHits().value);

        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String hitStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(hitStr, Goods.class);
            System.out.println("goods = " + goods);
        }

    }

/**
* 范围查询
* range
* sort排序
*/

 @Test
    public void testRangeSearch() throws IOException {

        //创建查询对象
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询条件对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.sort("price", SortOrder.DESC);

        //查询语句构建
        RangeQueryBuilder priceQuery = QueryBuilders.rangeQuery("price");
        priceQuery.gte(2700);
        priceQuery.lte(3000);
        searchSourceBuilder.query(priceQuery);
        searchRequest.source(searchSourceBuilder);


        //开始查询
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        SearchHits hits = response.getHits();

        System.out.println("总记录数 = " + hits.getTotalHits().value);

        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String hitStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(hitStr, Goods.class);
            System.out.println("goods = " + goods);
        }
    }

/**
* 指定多个字段查询
* queryString
* 会对查询条件进行分词
* 把分词后的条件词和对应词条等值匹配
* 默认取并集(OR包含任意一个分词就行)
* 可以指定多个字段进行查询
*/

 @Test
    public void testQureyString() throws IOException {

        //创建查询请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery("华为手机");
        queryStringQueryBuilder.field("title").field("categoryName").field("brachName").defaultOperator(Operator.AND);
        searchSourceBuilder.query(queryStringQueryBuilder);
        searchRequest.source(searchSourceBuilder);

        //查询
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        SearchHits hits = response.getHits();

        System.out.println("总记录数 = " + hits.getTotalHits().value);

        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String hitStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(hitStr, Goods.class);
            System.out.println("goods = " + goods);
        }
    }

/**
* boolQuery:对多个查询条件连接,连接方式:
* must(and):条件必须成立
* must_not(not):条件必须不成立
* should(or):条件可以成立
* filter:条件必须成立,性能比must高,不会计算得分
*/

    @Test
    public void testBoolQuery() throws IOException {

        //创建请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建请求条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        BoolQueryBuilder query = QueryBuilders.boolQuery(); //boolQuery


        TermQueryBuilder termQuery = QueryBuilders.termQuery("brandName.keyword", "华为");
        query.must(termQuery);  //品牌必须为华为,会有评分(查询排序,评分高上边)

        MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("title", "手机");
        query.filter(matchQuery); //必须title包含手机,过滤不带评分

        RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("price");
        rangeQuery.gte(2700);//范围必须为2000--3000
        rangeQuery.lte(3000);
        query.filter(rangeQuery);

        //开始查询
        searchSourceBuilder.query(query);
        searchRequest.source(searchSourceBuilder);
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        SearchHits hits = response.getHits();

        System.out.println("总记录数 = " + hits.getTotalHits().value);

        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String hitStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(hitStr, Goods.class);
            System.out.println("goods = " + goods);
        }

    }

/**
* 聚合查询
* 1,指标聚合:相当于MySQL的聚合函数,max,min,avg,sum等
* 2,桶聚合:相当于MySQL的group by操作,不要对text类型的数据进行分组,会失败
*/

 @Test
    public void testAggQuery() throws IOException {

        //创建请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询对象
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //1. 查询title包含手机的数据
        MatchQueryBuilder mathQuery = QueryBuilders.matchQuery("title","手机");
        sourceBuilder.query(mathQuery);

        //2. 开始根据字段分组(name自定义的, 取数据用到)
        AggregationBuilder agg = AggregationBuilders.terms("goods_brands").field("brandName.keyword").size(5);
        sourceBuilder.aggregation(agg);


        //开始查询
        searchRequest.source(sourceBuilder);
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        
        //打印数据
        SearchHits hits = response.getHits();
        System.out.println("总记录数 = " + hits.getTotalHits().value);

        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String hitStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(hitStr, Goods.class);
            System.out.println("goods = " + goods);
        }



        //打印聚合数据
        Aggregations aggregations = response.getAggregations();
        Map<String, Aggregation> aggregationMap = aggregations.asMap();
        Terms goods_brands = (Terms)aggregationMap.get("goods_brands");
        List<? extends Terms.Bucket> buckets = goods_brands.getBuckets();

        for (Terms.Bucket bucket : buckets) {
            Object key = bucket.getKey();
            System.out.println("key = " + key + "count: " + bucket.getDocCount());
        }

    }

/**
* 高亮查询
* 高亮三要素
* 高亮字段
* 前缀
* 后缀
*/

 @Test
    public void testHightLightFied() throws IOException {

        //创建请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //创建查询构建
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //term查询
        TermQueryBuilder termQuery = QueryBuilders.termQuery("title", "华为");
        sourceBuilder.query(termQuery);

        //高亮查询
        HighlightBuilder  highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("title");
        highlightBuilder.preTags("<font color='red'>");
        highlightBuilder.postTags("</font>");
        sourceBuilder.highlighter(highlightBuilder);

        //开始查询
        searchRequest.source(sourceBuilder);
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {

            //source字段转json串
            String sourceAsString = hit.getSourceAsString();
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);

            //highlight字段获取高亮title
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField highlightField = highlightFields.get("title");
            Text[] fragments = highlightField.fragments();
            Text fragment = fragments[0];
            String hightlightStr = fragment.toString();
            goods.setTitle(hightlightStr);


            System.out.println("goods = " + goods);
        }
    }

有关ES条件查询的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  4. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  5. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  6. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  7. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  8. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  9. ruby-on-rails - 使用包含多个关联和单独的条件 - 2

    我的Gallery模型中有以下查询:media_items.includes(:photo,:video).rank(:position_in_gallery)我的图库模型有_许多媒体项,每个都有一个照片或视频关联。到目前为止,一切正常。它返回所有media_items包括它们的photo或video关联,由media_item的position_in_gallery属性排序。但是我现在需要将此查询返回的照片限制为仅具有is_processing属性的照片,即nil。是否可以进行相同的查询,但条件是返回的照片等同于:.where(photo:'photo.is_processingIS

  10. ruby-on-rails - 在 haml View 中重构条件 - 2

    除了可访问性标准不鼓励使用这一事实指向当前页面的链接,我应该怎么做重构以下View代码?#navigation%ul.tabbed-ifcurrent_page?(new_profile_path)%li{:class=>"current_page_item"}=link_tot("new_profile"),new_profile_path-else%li=link_tot("new_profile"),new_profile_path-ifcurrent_page?(profiles_path)%li{:class=>"current_page_item"}=link_tot("p

随机推荐