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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • stringbuffer stringbuilder区别(其他和其它的区别)

    String字符串常量StringBuffer字符串变量(线程安全)StringBuilder字符串变量(非线程安全) 简要的说,String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字

    2022年4月11日
    43
  • jenkins安装与配置centos_centos7单用户模式修改密码

    jenkins安装与配置centos_centos7单用户模式修改密码CentOS7修改Jenkins用户

    2022年4月21日
    85
  • Js保留两位小数_小数点保留两位方法

    Js保留两位小数_小数点保留两位方法javascript语言,因为是弱类型语言,没有java那么多类型,所以在处理浮点数保留两位小数上,没有那么多办法,su但是字符串和整数,浮点数还是有区别的,

    2022年8月10日
    9
  • 力争群雄:2012年度IT博客大赛100强脱颖而出[通俗易懂]

    力争群雄:2012年度IT博客大赛100强脱颖而出[通俗易懂]2012年度IT博客大赛于11月20日圆满结束。这一所谓的“海选”阶段为期33天,引无数网友和博主翘首以待,来源包括51CTO、独立个人博客、其他博客服务托管商,以及今年评选新增加的分类如独立博客、学生博客和团队博客等众多博主共同参加了这一角逐,其中100位实力雄厚和人气充盈的博主获得了前100强的殊荣。他们占据了25万张票选中的8成以上份量,并将为2012年度IT博客50…

    2022年7月21日
    12
  • 降维算法:主成分分析 VS 自动编码器

    降维算法:主成分分析 VS 自动编码器降维是一种减少特征空间维度以获得稳定的、统计上可靠的机器学习模型的技术。降维主要有两种途径:特征选择和特征变换。特征选择通过选择重要程度最高的若干特征,移除共性的或者重要程度较低的特征。特征转换也称为特征提取,试图将高维数据投影到低维空间。一些特征转换技术有主成分分析(PCA)、矩阵分解、自动编码器(Autoencoders)、t-Sne、UMAP等。本文主要介绍了主成分分析以及自动编码器两种方法,具体分析两者的优缺点,并且通过一个生动的示例进行详解。主成分分析主成分分析是一种无监督技术,将原始数

    2022年5月27日
    36
  • java pfx_如何在Java中读取.pfx文件的内容?

    java pfx_如何在Java中读取.pfx文件的内容?我有file.pfx文件,还有一个私钥.如何在Java中读取file.pfx中的证书?我用过这段代码:importjava.security.*;importjava.security.cert.Certificate;importjava.security.cert.X509Certificate;importjava.security.cert.CertificateException…

    2022年6月7日
    76

发表回复

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

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