ElasticSearch 9种查询搜索管理

ElasticSearch 9种查询搜索管理

1. 查询所有文档

    //查询所有document
    @Test
    public void testSearch() throws IOException {
        //设置查询索引库和类型
        SearchRequest xc_course = new SearchRequest("xc_course");
        xc_course.types("doc");

        //设置查询范围
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        //要查询的出来的映射和不想要查询出来的映射
        searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price", "timestamp", "pic"}, new String[]{});

        //索引绑定条件
        xc_course.source(searchSourceBuilder);

        //开始搜素
        SearchResponse searchResponse = restHighLevelClient.search(xc_course);
        SearchHits hits = searchResponse.getHits();
        System.out.println(hits.getTotalHits());
        System.out.println("============================================");
        SearchHit[] hitsHits = hits.getHits();
        for (SearchHit hitsHit : hitsHits) {
            System.out.println(hitsHit.getId());
            Map<String, Object> sourceAsMap = hitsHit.getSourceAsMap();
            System.out.println(sourceAsMap.get("name"));
            System.out.println(sourceAsMap.get("description"));
            System.out.println(sourceAsMap.get("studymodel"));
            System.out.println(sourceAsMap.get("price"));
            System.out.println(sourceAsMap.get("timestamp"));
            System.out.println(sourceAsMap.get("pic"));
            System.out.println("=============================================");
        }
    }

2. 分页查询

分页是SearchSourceBuilder的一个功能

//分页查询
    @Test
    public void testPageSearch() throws IOException {
        //设置查询索引库和类型
        SearchRequest xc_course = new SearchRequest("xc_course");
        xc_course.types("doc");

        //设置查询范围
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        //要查询的出来的映射和不想要查询出来的映射
        searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price", "timestamp", "pic"}, new String[]{});

        //设置分页参数
        int page = 1;
        int size = 1;
        int from = (page - 1) * size;
        searchSourceBuilder.from(from);
        searchSourceBuilder.size(size);

        //索引绑定条件
        xc_course.source(searchSourceBuilder);

        //开始搜素
        SearchResponse searchResponse = restHighLevelClient.search(xc_course);
        SearchHits hits = searchResponse.getHits();
        System.out.println(hits.getTotalHits());
        System.out.println("============================================");
        SearchHit[] hitsHits = hits.getHits();
        for (SearchHit hitsHit : hitsHits) {
            System.out.println(hitsHit.getId());
            Map<String, Object> sourceAsMap = hitsHit.getSourceAsMap();
            System.out.println(sourceAsMap.get("name"));
            System.out.println(sourceAsMap.get("description"));
            System.out.println(sourceAsMap.get("studymodel"));
            System.out.println(sourceAsMap.get("price"));
            System.out.println(sourceAsMap.get("timestamp"));
            System.out.println(sourceAsMap.get("pic"));
            System.out.println("=============================================");
        }
    }

3. Term Query

//查询name为spring的document -- 精准查询 --不再将关键词分词
    @Test
    public void testExectlySearch() throws IOException {
        //设置查询索引库和类型
        SearchRequest xc_course = new SearchRequest("xc_course");
        xc_course.types("doc");

        //设置查询范围
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.termQuery("name", "spring"));
        searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price", "timestamp", "pic"}, new String[]{});

        //索引绑定条件
        xc_course.source(searchSourceBuilder);

        //开始搜素
        SearchResponse searchResponse = restHighLevelClient.search(xc_course);
        SearchHits hits = searchResponse.getHits();
        System.out.println(hits.getTotalHits());
        System.out.println("============================================");
        SearchHit[] hitsHits = hits.getHits();
        for (SearchHit hitsHit : hitsHits) {
            System.out.println(hitsHit.getId());
            Map<String, Object> sourceAsMap = hitsHit.getSourceAsMap();
            System.out.println(sourceAsMap.get("name"));
            System.out.println(sourceAsMap.get("description"));
            System.out.println(sourceAsMap.get("studymodel"));
            System.out.println(sourceAsMap.get("price"));
            System.out.println(sourceAsMap.get("timestamp"));
            System.out.println(sourceAsMap.get("pic"));
            System.out.println("=============================================");
        }
    }

根据id精确查询

//根据id查询
    @Test
    public void testIDSearch() throws IOException {
        //设置查询索引库和类型
        SearchRequest xc_course = new SearchRequest("xc_course");
        xc_course.types("doc");

        //设置查询范围
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        String[] ids = {"1", "3"};
        searchSourceBuilder.query(QueryBuilders.termsQuery("_id", ids));
        searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price", "timestamp", "pic"}, new String[]{});

        //索引绑定条件
        xc_course.source(searchSourceBuilder);

        //开始搜素
        SearchResponse searchResponse = restHighLevelClient.search(xc_course);
        SearchHits hits = searchResponse.getHits();
        System.out.println(hits.getTotalHits());
        System.out.println("============================================");
        SearchHit[] hitsHits = hits.getHits();
        for (SearchHit hitsHit : hitsHits) {
            System.out.println(hitsHit.getId());
            Map<String, Object> sourceAsMap = hitsHit.getSourceAsMap();
            System.out.println(sourceAsMap.get("name"));
            System.out.println(sourceAsMap.get("description"));
            System.out.println(sourceAsMap.get("studymodel"));
            System.out.println(sourceAsMap.get("price"));
            System.out.println(sourceAsMap.get("timestamp"));
            System.out.println(sourceAsMap.get("pic"));
            System.out.println("=============================================");
        }
    }

4. match Query

match Query即全文检索,它的搜索方式是先将搜索字符串分词,再使用各各词条从索引中搜索。 match query与Term query区别是match query在搜索前先将搜索关键字分词,再拿各各词语去索引中搜索。

4.1 基础使用

operator:or 表示 只要有一个词在文档中出现则就符合条件,and表示每个词都在文档中出现则才符合条件。

 //matchQuery 基础使用
    @Test
    public void testMatchSearch01() throws IOException {
        //设置查询索引库和类型
        SearchRequest xc_course = new SearchRequest("xc_course");
        xc_course.types("doc");

        //设置查询范围
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders
                .matchQuery("name", "spring开发")
                .operator(Operator.AND));//operation可以是AND或者OR,根据字面理解
        searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price", "timestamp", "pic"}, new String[]{});

        //索引绑定条件
        xc_course.source(searchSourceBuilder);

        //开始搜素
        SearchResponse searchResponse = restHighLevelClient.search(xc_course);
        SearchHits hits = searchResponse.getHits();
        System.out.println(hits.getTotalHits());
        System.out.println("============================================");
        SearchHit[] hitsHits = hits.getHits();
        for (SearchHit hitsHit : hitsHits) {
            System.out.println(hitsHit.getId());
            Map<String, Object> sourceAsMap = hitsHit.getSourceAsMap();
            System.out.println(sourceAsMap.get("name"));
            System.out.println(sourceAsMap.get("description"));
            System.out.println(sourceAsMap.get("studymodel"));
            System.out.println(sourceAsMap.get("price"));
            System.out.println(sourceAsMap.get("timestamp"));
            System.out.println(sourceAsMap.get("pic"));
            System.out.println("=============================================");
        }
    }

4.2 minimum_should_match

上边使用的operator = or表示只要有一个词匹配上就得分,如果实现三个词至少有两个词匹配如何实现?
使用minimum_should_match可以指定文档匹配词的占比。

//matchQuery minimum_should_match
    @Test
    public void testMatchSearch02() throws IOException {
        //设置查询索引库和类型
        SearchRequest xc_course = new SearchRequest("xc_course");
        xc_course.types("doc");

        //设置查询范围
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders
                .matchQuery("description", "前台页面开发框架构")
                .minimumShouldMatch("40%"));
        searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price", "timestamp", "pic"}, new String[]{});

        //索引绑定条件
        xc_course.source(searchSourceBuilder);

        //开始搜素
        SearchResponse searchResponse = restHighLevelClient.search(xc_course);
        SearchHits hits = searchResponse.getHits();
        System.out.println(hits.getTotalHits());
        System.out.println("============================================");
        SearchHit[] hitsHits = hits.getHits();
        for (SearchHit hitsHit : hitsHits) {
            System.out.println(hitsHit.getId());
            Map<String, Object> sourceAsMap = hitsHit.getSourceAsMap();
            System.out.println(sourceAsMap.get("name"));
            System.out.println(sourceAsMap.get("description"));
            System.out.println(sourceAsMap.get("studymodel"));
            System.out.println(sourceAsMap.get("price"));
            System.out.println(sourceAsMap.get("timestamp"));
            System.out.println(sourceAsMap.get("pic"));
            System.out.println("=============================================");
        }
    }

5. multi Query

上边学习的termQuery和matchQuery一次只能匹配一个Field,本节学习multiQuery,一次可以匹配多个字段。

5.1 基础使用,并提高field的权重boost倍

单项匹配是在一个field中去匹配,多项匹配是拿关键字去多个Field中匹配。

//查询多个域
    @Test
    public void testMultiSearch() throws IOException {
        //设置查询索引库和类型
        SearchRequest xc_course = new SearchRequest("xc_course");
        xc_course.types("doc");

        //设置查询范围
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders
                .multiMatchQuery("spring css", "name", "description")//之前的Query构造方法都是字段名在前面,multiMatchQuery是字段名在后面
                .minimumShouldMatch("50%")
                .field("name", 10));//这里是将name这个字段的相关度(权重)提高10倍
        searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price", "timestamp", "pic"}, new String[]{});

        //索引绑定条件
        xc_course.source(searchSourceBuilder);

        //开始搜素
        SearchResponse searchResponse = restHighLevelClient.search(xc_course);
        SearchHits hits = searchResponse.getHits();
        System.out.println(hits.getTotalHits());
        System.out.println("============================================");
        SearchHit[] hitsHits = hits.getHits();
        for (SearchHit hitsHit : hitsHits) {
            System.out.println(hitsHit.getId());
            System.out.println(hitsHit.getScore());
            Map<String, Object> sourceAsMap = hitsHit.getSourceAsMap();
            System.out.println(sourceAsMap.get("name"));
            System.out.println(sourceAsMap.get("description"));
            System.out.println(sourceAsMap.get("studymodel"));
            System.out.println(sourceAsMap.get("price"));
            System.out.println(sourceAsMap.get("timestamp"));
            System.out.println(sourceAsMap.get("pic"));
            System.out.println("=============================================");
        }
    }

6. 布尔查询

布尔查询对应于Lucene的BooleanQuery查询,实现将多个查询组合起来。

must:表示必须,多个查询条件必须都满足。(通常使用must)

should:表示或者,多个查询条件只要有一个满足即可。

must_not:表示非。

//多种查询条件查询所有document
    @Test
    public void testMustSearch() throws IOException {
        //设置查询索引库和类型
        SearchRequest xc_course = new SearchRequest("xc_course");
        xc_course.types("doc");

        //设置查询范围
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders
                .multiMatchQuery("spring css", "name", "description")
                .minimumShouldMatch("50%")
                .field("name", 10);
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("studymodel", "201001");
        boolQuery.must(multiMatchQueryBuilder).must(termQueryBuilder);
        searchSourceBuilder.query(boolQuery);
        searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price", "timestamp", "pic"}, new String[]{});

        //索引绑定条件
        xc_course.source(searchSourceBuilder);

        //开始搜素
        SearchResponse searchResponse = restHighLevelClient.search(xc_course);
        SearchHits hits = searchResponse.getHits();
        System.out.println(hits.getTotalHits());
        System.out.println("============================================");
        SearchHit[] hitsHits = hits.getHits();
        for (SearchHit hitsHit : hitsHits) {
            System.out.println(hitsHit.getId());
            Map<String, Object> sourceAsMap = hitsHit.getSourceAsMap();
            System.out.println(sourceAsMap.get("name"));
            System.out.println(sourceAsMap.get("description"));
            System.out.println(sourceAsMap.get("studymodel"));
            System.out.println(sourceAsMap.get("price"));
            System.out.println(sourceAsMap.get("timestamp"));
            System.out.println(sourceAsMap.get("pic"));
            System.out.println("=============================================");
        }
    }

7. 过滤器

过虑是针对搜索的结果进行过虑,过虑器主要判断的是文档是否匹配,不去计算和判断文档的匹配度得分,所以过虑器性能比查询要高,且方便缓存,推荐尽量使用过虑器去实现查询或者过虑器和查询共同使用。

过滤器的配置是在boolQueryBuilder配置

        //过滤器
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(60).lte(100));
        searchSourceBuilder.query(boolQueryBuilder);

8. 排序

排序是SearchSourceBuilder的一个功能

	//排序
        searchSourceBuilder.sort("price", SortOrder.DESC);

9. 高亮显示

高亮显示可以将搜索结果一个或多个字突出显示,以便向用户展示匹配关键字的位置。 在搜索语句中添加highlight即可实现

 //运用所有查询方式
    @Test
    public void testFilterSearch() throws IOException {
        //设置查询索引库和类型
        SearchRequest xc_course = new SearchRequest("xc_course");
        xc_course.types("doc");

        //设置查询范围
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //查询所有
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "开发");
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(matchQueryBuilder);
        //过滤器
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(60).lte(100));
        searchSourceBuilder.query(boolQueryBuilder);
        //排序
        searchSourceBuilder.sort("price", SortOrder.DESC);
        searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price", "timestamp", "pic"}, new String[]{});
        //高亮显示
        HighlightBuilder highlightBuilder=new HighlightBuilder();
        highlightBuilder.preTags("<tag>");
        highlightBuilder.postTags("</tag>");
        highlightBuilder.fields().add(new HighlightBuilder.Field("name"));

        searchSourceBuilder.highlighter(highlightBuilder);

        //索引绑定条件
        xc_course.source(searchSourceBuilder);

        //开始搜素
        SearchResponse searchResponse = restHighLevelClient.search(xc_course);
        SearchHits hits = searchResponse.getHits();
        System.out.println("一共有"+hits.getTotalHits()+"条记录");
        System.out.println("============================================");
        SearchHit[] hitsHits = hits.getHits();
        for (SearchHit hitsHit : hitsHits) {
            System.out.println("document的id:"+hitsHit.getId());
            Map<String, Object> sourceAsMap = hitsHit.getSourceAsMap();
            System.out.println("原本的name:"+sourceAsMap.get("name"));
            Map<String, HighlightField> highlightFields = hitsHit.getHighlightFields();
            if(highlightFields!=null||highlightFields.size()!=0){
                HighlightField highlightField = highlightFields.get("name");
                if(highlightField!=null){
                    Text[] fragments = highlightField.getFragments();
                    StringBuilder stringBuilder=new StringBuilder();
                    for (Text text : fragments) {
                        stringBuilder.append(text);
                    }
                    System.out.println("高亮显示的name:"+stringBuilder.toString());
                }
            }
            System.out.println(sourceAsMap.get("description"));
            System.out.println(sourceAsMap.get("studymodel"));
            System.out.println(sourceAsMap.get("price"));
            System.out.println(sourceAsMap.get("timestamp"));
            System.out.println(sourceAsMap.get("pic"));
            System.out.println("=============================================");
        }
    }

转载于:https://my.oschina.net/edisonOnCall/blog/3043250

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100950.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Hibernate之Query.uniqueResult()结果为数值的注意事项

    Hibernate之Query.uniqueResult()结果为数值的注意事项在日常练习中使用Query.uniqueResult()获取查询总数量,想当然的把返回结果值直接强转成Integer类型,实现运行报错,具体代码如下:控制台错误信息如下:返回值为Long型,使用时需要二次转换,Long->Integer,修改后运行成功,如下所示:

    2022年9月30日
  • Arthas – Java 线上问题定位处理的终极利器「建议收藏」

    Arthas – Java 线上问题定位处理的终极利器「建议收藏」前言在使用Arthas之前,当遇到Java线上问题时,如CPU飙升、负载突高、内存溢出等问题,你需要查命令,查网络,然后jps、jstack、jmap、jhat、jstat、hprof等一通操作。最终焦头烂额,还不一定能查出问题所在。而现在,大多数的常见问题你都可以使用Arthas轻松定位,迅速解决,及时止损,准时下班。1、Arthas介绍Arthas是Alib…

    2022年10月22日
  • 生存分析(Survival Analysis)、Cox风险比例回归模型(Cox proportional hazards model)及「建议收藏」

    生存分析(Survival Analysis)、Cox风险比例回归模型(Cox proportional hazards model)及「建议收藏」生存分析(SurvivalAnalysis)、Cox风险比例回归模型(Coxproportionalhazardsmodel)及C-index1.生存分析生存分析指的是一系列用来探究所感兴趣的事件的发生的时间的统计方法。常见的有1)癌症患者生存时间分析2)工程中的失败时间分析等等。1.1定义给定一个实例iii,我们用一个三元组来表示(Xi,δi,Ti)(X_i,\del…

    2022年5月14日
  • python中文占几个字节_中文在python中占几个字节

    python中文占几个字节_中文在python中占几个字节如果是utf-8编码,那么一个中文字符占用三个字节,一个英文字符占用一个字节。如果是gbk编码,那么一个中文字符占用两个字节,一个英文字符占用一个字节。如果是utf-8编码,那么一个中文包含繁体字等于三个字节,一个英文字符等于一个字节。如果是gbk编码,那么一个中文包含繁体字等于两个字节,一个英文字符等于一个字节。(推荐学习:Python入门教程)我们可以用如下方法来判断:中文和符号:print(…

    2022年6月26日
  • 带通滤波器电路图大全(三款带通滤波器电路设计原理图详解)「建议收藏」

    带通滤波器电路图大全(三款带通滤波器电路设计原理图详解)「建议收藏」带通滤波器电路图设计(一)传统的带通滤波器设计方法中涉及了很多复杂的理论分析和计算。针对上述缺点,介绍一种使用EDA软件进行带通滤波器的设计方案,详细阐述了使用FilterPro软件进行有源带通滤波器电路的设计步骤,然后给出了在Proteus中对所设计的滤波器进行仿真分析和测试的方法。测试结果表明,使用该方法设计的带通滤波器具有性能稳定。设计难度小等优点,也为滤波器的设计提供了一个新的思路。…

    2022年6月7日
  • 分苹果_分苹果编程

    分苹果_分苹果编程分苹果时间限制:1000 ms | 内存限制:65535 KB难度:2描述把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(注意:假如有3个盘子7个苹果,5,1,1和1,5,1是同一种分法。)输入t,表示测试组数(t输出输出不同的分法样例输入173样例输出8

    2022年10月12日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号