Elasticsearch DSL搜索

索引库映射创建 封装客户端

创建单元测试

@SpringBootTest(classes = SearchApplication.class)
@RunWith(SpringRunner.class)
public class Test2 {

    @Autowired
    RestHighLevelClient client;

    @Autowired
    RestClient restClient;

}

搜索全部 matchAllQuery

//搜索全部matchAllQuery
    @Test
    public void test01() throws IOException {
        //搜索请求对象
        SearchRequest searchRequest = new SearchRequest("索引库名称"); searchRequest.types("类型名称");
        //搜索源对象 matchAllQuery 搜索全部
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 
        //指定为matchAllQuery
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        //source源字段过虑  第一个需要搜索的字符串数组,第二个需要过滤的字符串数组
        searchSourceBuilder.fetchSource(new String[]{"映射字段名","映射字段名"}, new String[]{});
        //向搜索请求对象中设置搜索源对象
        searchRequest.source(searchSourceBuilder);
        //搜索结果
        SearchResponse search = client.search(searchRequest);
        SearchHits hits = search.getHits();
        System.out.println("搜索结果数量为---"+hits.getTotalHits());
        //得到匹配度高的文档
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit documentFields : hits1) {
            Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
            System.out.println(sourceAsMap.get("映射字段名"));
        }
    }

分页查询 与mysql limit 类似

       //在客户端请求 获取搜索结果前添加  
       searchSourceBuilder.from(当前记录起始位置);
       searchSourceBuilder.size(每页显示记录数);


搜索时不对查询条件进行分词 termQuery

//在搜索源对象中 设置termQuery
searchSourceBuilder.query(QueryBuilders. termQuery("映射字段名","查询条件"));

搜索时对查询条件分词 matchQuery

//在搜索源对象中 设置matchQuery
QueryBuilders.
                matchQuery("映射字段名","查询条件").
                //operator(Operator.OR)  //OR 匹配一个词就行,AND 都需要匹配
                minimumShouldMatch("30%")  //分词后*80% 向上取整  例2*80% = 1 文章满足1个词即可

搜索时对查询条件分词 匹配多个字段 multiMatchQuery

//在搜索源对象中 设置matchQuery
QueryBuilders.
                multiMatchQuery("查询条件","映射字段名","映射字段名").
                //operator(Operator.OR) //OR 匹配一个词就行,AND 都需要匹配
                minimumShouldMatch("80%").
                //提高权重 当关键词在指定映射字段中出现时,匹配分值提高10倍       
                field("指定映射字段名",10)

布尔查询 可以将上述多个条件结合

       //查询条件 1
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.
                multiMatchQuery("查询条件","映射字段名","映射字段名").
                minimumShouldMatch("80%").
                //提高权重 当关键词在name中出现时,提高10倍        
                field("description", 10);
        //查询条件 2
        TermQueryBuilder termQueryBuilder = QueryBuilders. termQuery("映射字段名","查询条件");
        //布尔查询
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        //must:表示必须,多个查询条件必须都满足。(通常使用must) 
        //should:表示或者,多个查询条件只要有一个满足即可
    	//must_not:表示非
        boolQueryBuilder.must(multiMatchQueryBuilder);
        searchSourceBuilder.query(boolQueryBuilder);

过滤器 对查询结果进行过滤

//过滤器 不计算得分 效率要比查询高
        //查询条件
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.
                multiMatchQuery("spring css", "description").
                minimumShouldMatch("80%").
                //提高权重 当关键词在name中出现时,提高10倍        
                        field("description", 10);
        //布尔查询
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        boolQueryBuilder.filter(QueryBuilders.termQuery("映射字段名","查询条件"));
        searchSourceBuilder.query(boolQueryBuilder);

对查询结果高亮显示


        //创建高亮对象
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        //根据需求添加前端高亮标签
        highlightBuilder.preTags("<tag>"); //前缀
        highlightBuilder.postTags("<tag>"); //后缀
        highlightBuilder.field("高亮映射字段");
        //在搜索源中设置高亮对象
        searchSourceBuilder.highlighter(highlightBuilder);

		//高亮取值
		//搜索结果
        SearchResponse search = client.search(searchRequest);
        SearchHits hits = search.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit documentFields : hits1) {
            //获取高亮内容
            Map<String, HighlightField> highlightFields = documentFields.getHighlightFields();
            HighlightField name = highlightFields.get("高亮映射字段");
            Text[] fragments = name.getFragments();
            StringBuilder stringBuilder = new StringBuilder();
            for (Text fragment : fragments) {
                stringBuilder.append(fragment);
            }
            System.out.println("课程名称----"+stringBuilder.toString());
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值