java连接solr并设置高亮域

本文介绍如何在SpringBoot项目中集成Solr,并通过示例代码演示如何配置查询参数,实现对法律条文的高效搜索及关键词高亮显示。

关于springboot 和solr 的集成可以看我另一篇文章

我的solr里主要存的是法条,有如下几个域

id,law_title,law_content

其中title和content组成一个复制域,law_keywords

下面是我的service层的代码

public SearchResult search(String keyword, int page, int rows) throws IOException, SolrServerException {
        SolrQuery query = new SolrQuery();
        query.setQuery(keyword);
        if (page<=0) {
            page=1;
        }
        query.setStart((page - 1) * rows);
        query.setRows(rows);
        query.set("df", "law_keywords");
        query.setHighlight(true);
        query.addHighlightField("law_title");
        query.addHighlightField("law_content");
        query.setHighlightSimplePre("<em style=\"color:red\">");
        query.setHighlightSimplePost("</em>");
        query.setHighlightFragsize(2147483647);
        SearchResult searchResult = null;
        searchResult = searchDao.search(query);
        long recordCount = searchResult.getRecordCount();
        int totalPage = (int)(recordCount/rows);
        if (recordCount % rows >0) {
            totalPage++;
        }
        searchResult.setTotalPages(totalPage);
        return searchResult;
    }

其中df表示的是default field ,默认查哪个域

我默认搜索的是law_title和law_content组成的复制域law_keywords

setHighightFragsize 是设置solr的最大查询字符串,这个默认是100,也就是100字符之后将不再显示

setHighlightSimplePre 和post是设置高亮域的前后缀,如果想在网页上显示成红色效果就套上一个em标签

下面是dao代码

public SearchResult search(SolrQuery query) throws IOException, SolrServerException {
        QueryResponse queryResponse = solrClient.query(query);
        SolrDocumentList solrDocumentList = queryResponse.getResults();
        long numFound = solrDocumentList.getNumFound();
        SearchResult result  = new SearchResult();
        result.setRecordCount(numFound);
        Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
        List<Law> lawList = new ArrayList<>();
        for (org.apache.solr.common.SolrDocument solrDocument : solrDocumentList) {
            Law law = new Law();
            System.out.println();
            int id = Integer.valueOf((String) solrDocument.get("id"));
            law.setId(id);
            law.setContent((String) solrDocument.get("law_content"));
            List<String> titleList= highlighting.get(solrDocument.get("id")).get("law_title");
            List<String> contentList= highlighting.get(solrDocument.get("id")).get("law_content");
            String title="";
            String content = "";
            if (titleList !=null && titleList.size()>0) {
                title = titleList.get(0);
            }else {
                title = (String) solrDocument.get("law_title");
            }
            if (contentList !=null && contentList.size()>0) {
                content = contentList.get(0);
            }else {
                content = (String) solrDocument.get("law_content");
            }
            law.setTitle(title);
            law.setContent(content);
            lawList.add(law);
        }
        result.setItemList(lawList);
        return result;
    }

这里我把law_title以及law_content都设置为高亮域

@Test
    public void testSearch() throws IOException, SolrServerException {
        SearchResult searchResult = searchService.search("文物盗窃", 1, 10);
        List<Law> list = searchResult.getItemList();
        for (Law law : list) {
            System.out.println(law.getTitle());
            System.out.println(law.getContent());
        }
    }

最后写一个测试类进行测试


可以看到title 和content的关键字都被打上了em标签

Java连接Solr客户端多节点,可以使用SolrCloud模式进行处理。SolrCloud是Solr的分布式模式,它允许将索引数据和查询负载分布到多个Solr节点上。在SolrCloud中,节点可以被视为一个集合,称为“集合”,集合可以包含多个节点。 以下是连接Solr客户端多节点的步骤: 1. 配置SolrCloud 首先需要配置SolrCloud,包括创建集合和添加节点。可以使用Solr的命令行工具(如solr create命令)或Solr管理界面来完成此操作。 2. 创建SolrClient对象 在Java代码中,需要创建SolrClient对象来连接SolrCloud。SolrClient是Solr的客户端API,它提供了与Solr交互的方法,包括添加文档、查询索引、删除文档等。 可以使用SolrServer类或SolrCloud类来创建SolrClient对象。SolrServer类用于连接单个Solr节点,而SolrCloud类用于连接SolrCloud集合中的多个节点。 3. 指定SolrCloud集合 在创建SolrClient对象时,需要指定SolrCloud集合的名称。这样SolrClient就可以连接SolrCloud集合中的所有节点。 4. 执行Solr查询 使用SolrClient对象执行Solr查询。SolrClient提供了多种查询方法,包括SolrQuery和SolrParams类。SolrQuery类用于构建查询字符串,SolrParams类用于设置查询参数。 5. 处理查询结果 SolrClient的查询方法返回一个QueryResponse对象,该对象包含查询结果和元数据。可以使用QueryResponse对象获取查询结果进行处理。 示例代码如下: ```java // 创建SolrClient对象 SolrClient solrClient = new CloudSolrClient.Builder() .withZkHost("localhost:2181") .withCollection("mycollection") .build(); // 构建查询对象 SolrQuery query = new SolrQuery(); query.setQuery("*:*"); // 执行查询 QueryResponse response = solrClient.query(query); // 获取查询结果 SolrDocumentList documents = response.getResults(); for (SolrDocument document : documents) { System.out.println(document); } // 关闭SolrClient对象 solrClient.close(); ``` 在上面的示例中,使用CloudSolrClient类创建SolrClient对象,指定了ZooKeeper的地址和SolrCloud集合的名称。然后构建了一个查询对象,执行查询获取查询结果。最后关闭SolrClient对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值