Advertisement

全文搜索引擎 solr------(四)solrj 实现java 代码操作

阅读量:

前言

在学习过程中, 我们已经掌握了solr的基本配置与概念. 接下来研究一下Java中的实现细节, 请确保我们的Solr服务能够正常运行.

引入jar包

在基于Spring Boot的项目中进行测试时,通常只需要添加一个starter component就可以完成配置,并且该组件内部集成了一个solrJ功能。

复制代码
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-data-solr</artifactId>
    		</dependency>

上代码

复制代码
    package com.example.demo.service;
    
    import org.apache.solr.client.solrj.SolrClient;
    import org.apache.solr.client.solrj.SolrQuery;
    import org.apache.solr.client.solrj.SolrServerException;
    import org.apache.solr.client.solrj.impl.HttpSolrClient;
    import org.apache.solr.client.solrj.response.QueryResponse;
    import org.apache.solr.common.SolrDocument;
    import org.apache.solr.common.SolrDocumentList;
    import org.apache.solr.common.SolrInputDocument;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /** * Created by Administrator on 2019/10/10.
     */
    public class SolrTest {
    
    public static void main(String[] args) {
        try {
          //  new SolrTest().addDocument();
          //  new SolrTest().delete();
          //  new SolrTest().simpleQuery(); // 简单查询
            new SolrTest().hardQuery(); // 复杂查询
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void addDocument() throws Exception {
        String solrUrl = "http://localhost:8983/solr/";
        // 1 通过 HttpSolrClient 建立连接,老的版本是 HttpSolrServer对象
        HttpSolrClient client = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();
        // 2、 创建SolrInputDocument对象,然后通过它来添加域。
        SolrInputDocument document = new SolrInputDocument();
        // 第一个参数:域的名称,域的名称必须是在schema.xml中定义的
        // 第二个参数:域的值
        // 注意:id的域不能少
        document.addField("id", "c0001");
        document.addField("s_name", "赵四");
        document.addField("s_address", "上海市宝山区");
        // 3、 将document添加到索引库。
        client.add("collection",document);
        // 4、 提交。
        client.commit("collection");
        // 注意: 由于我们建立连接的是时候没有 指定实例名称,所以 add 和commit 的时候要指定,不然会报错
    }
    
    public void delete(){
        String solrUrl = "http://localhost:8983/solr/collection";
        HttpSolrClient client = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();
        try {
            // 写法很多,可以百度下
         //   client.deleteById("c0002");
            client.deleteByQuery("id:c0003");
            client.commit();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void simpleQuery(){
        String solrUrl = "http://localhost:8983/solr/collection";
        HttpSolrClient client = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();
        System.out.println(client);
        try {
            // 创建SolrQuery对象
            SolrQuery query = new SolrQuery();
            query.set("q","*:*"); // 查询所有的
            QueryResponse response = client.query(query);
            SolrDocumentList solrDocuments = response.getResults();
            long count = solrDocuments.getNumFound();
            System.out.println("count is "+count);
            for (SolrDocument document: solrDocuments) {
                System.out.println(document.get("id"));
                System.out.println(document.get("s_name"));
                System.out.println(document.get("s_address"));
            }
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void hardQuery(){
        String solrUrl = "http://localhost:8983/solr/collection2";
        HttpSolrClient client = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();
        System.out.println(client);
        try {
            // 创建SolrQuery对象
            SolrQuery query = new SolrQuery();
            query.set("q","花儿"); // 设定搜索条件 q
            query.setFilterQueries("p_catalog_name:与钟不同"); // fq: 过滤条件
            query.setSort("id", SolrQuery.ORDER.asc); // sort: 设置排序
            query.setStart(0);
            query.setRows(10); // 分页,每页10 条
            query.setFields("id","p_name","p_catalog","p_catalog_name");// 显示的字段
            query.set("df","p_name"); // 设置默认搜索域
            query.setHighlight(true); // 设置开启高亮
            query.addHighlightField("p_name");
            query.setHighlightSimplePre("<span color='red'>");
            query.setHighlightSimplePost("</spam>"); // 高亮的格式,和页面的基本是一样的
    
            // 查询索引库
            QueryResponse response = client.query(query);
    
            SolrDocumentList solrDocuments = response.getResults();
            // 得到高亮部分的集合
            Map<String,Map<String,List<String>>> hightingMap = response.getHighlighting();
            long count = solrDocuments.getNumFound();
            System.out.println("count is "+count);
            for (SolrDocument document: solrDocuments) {
                String id = document.get("id").toString();
                String productName = document.get("p_name").toString();
                String catalog = document.get("p_catalog").toString();
                String catalogName = document.get("p_catalog_name").toString();
               List<String> list = hightingMap.get(id).get("p_name");
               if(list!=null){
                   productName = list.get(0); // 如果有高亮信息,把高亮的值赋给 产品名称
               }
                System.out.println("id="+id+", p_name="+productName+", p_catalog="+catalog+", p_catalog_name="+catalogName);
    
            }
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    }

全部评论 (0)

还没有任何评论哟~