Solr第二讲——SolrJ客户端的使用与案例

一、Solrj的使用

  1.什么是Solrj

  solrj是访问Solr服务的java客户端(就像通过jedis操作redis一样),提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:

  

  2.如何使用

     需要的是solrj的包与拓展服务包

    

    使用solrj完成索引的维护:

    在solr中,索引库中都会存在一个唯一键,如果一个Document的id存在,则执行修改操作,如果不存在,则执行添加操作。

      添加/修改索引:   

    1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。

    2、 创建SolrInputDocument对象,然后通过它来添加域。

    3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。

    4、 提交。

@Test
    public void addDocument() throws Exception {

        // 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
        // 参数:solr服务器的访问地址
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");
        // 2、 创建SolrInputDocument对象,然后通过它来添加域。
        SolrInputDocument document = new SolrInputDocument();
        // 第一个参数:域的名称,域的名称必须是在schema.xml中定义的
        // 第二个参数:域的值
        // 注意:id的域不能少
        document.addField("id", "c0001");
        document.addField("title_ik", "使用solrJ添加的文档");
        document.addField("content_ik", "文档的内容");
        document.addField("product_name", "商品名称");
        // 3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。
        server.add(document);
        // 4、 提交。
        server.commit();
    }
View Code

      在界面查询索引查看效果:使用域名:名称,例如 id:c001的格式

    

 

       根据ID删除索引

@Test
    public void deleteDocument() throws Exception {
        // 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
        // 参数:solr服务器的访问地址
        HttpSolrServer server = new HttpSolrServer(
                "http://localhost:8080/solr/");
        // 根据ID删除
        server.deleteById("c0001");
        // 提交
        server.commit();
    }
View Code

      根据条件删除

@Test
    public void deleteDocumentByQuery() throws Exception {
        // 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
        // 参数:solr服务器的访问地址
        HttpSolrServer server = new HttpSolrServer(
                "http://localhost:8080/solr/");
        // 根据ID删除
        server.deleteByQuery("id:c0001");
        // 全部删除
        // server.deleteByQuery("*:*");
        // 提交
        server.commit();
    }
View Code

      查询索引

 

@Test
    public void queryIndex() throws Exception {
        // 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
        // 参数:solr服务器的访问地址
        HttpSolrServer server = new HttpSolrServer(
                "http://localhost:8080/solr/");

        // 创建SolrQuery对象
        SolrQuery query = new SolrQuery();
        // 设置查询条件,名称“q”是固定的且必须 的
        query.set("q", "id:2");

        // 调用server的查询方法,查询索引库
        QueryResponse response = server.query(query);

        // 查询结果
        SolrDocumentList results = response.getResults();

        // 查询结果总数
        long cnt = results.getNumFound();
        System.out.println("查询结果总数:" + cnt);

        for (SolrDocument solrDocument : results) {
            System.out.println(solrDocument.get("id"));
            System.out.println(solrDocument.get("product_name"));
            System.out.println(solrDocument.get("product_price"));
            System.out.println(solrDocument.get("product_catalog_name"));
            System.out.println(solrDocument.get("product_picture"));

        }
    }
View Code

 

      复杂查询

@Test
    public void queryIndex2() throws Exception {
        // 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
        // 参数:solr服务器的访问地址
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");

        // 创建SolrQuery对象
        SolrQuery query = new SolrQuery();

        // 设置查询条件
        query.setQuery("钻石");
        // 设置过滤条件
        query.setFilterQueries("product_catalog_name:幽默杂货");
        // 设置排序
        query.setSort("product_price", ORDER.desc);
        // 设置分页信息
        query.setStart(0);
        query.setRows(10);

        // 设置显得的域的列表
        query.setFields("id", "product_name", "product_price",
                "product_catalog_name", "product_picture");

        // 设置默认搜索域
        query.set("df", "product_name");

        // 设置高亮
        query.setHighlight(true);
        query.addHighlightField("product_name");
        query.setHighlightSimplePre("<em>");
        query.setHighlightSimplePost("</em>");

        // 调用server的查询方法,查询索引库
        QueryResponse response = server.query(query);

        // 查询结果
        SolrDocumentList results = response.getResults();

        // 查询结果总数
        long cnt = results.getNumFound();
        System.out.println("查询结果总数:" + cnt);

        for (SolrDocument solrDocument : results) {
            System.out.println(solrDocument.get("id"));

            String productName = (String) solrDocument.get("product_name");

            //获取高亮列表
            Map<String, Map<String, List<String>>> highlighting = response
                    .getHighlighting();
            //获得本文档的高亮信息
            List<String> list = highlighting.get(solrDocument.get("id")).get(
                    "product_name");
            //如果有高亮,则把商品名称赋值为有高亮的那个名称
            if (list != null) {
                productName = list.get(0);
            }

            System.out.println(productName);
            System.out.println(solrDocument.get("product_price"));
            System.out.println(solrDocument.get("product_catalog_name"));
            System.out.println(solrDocument.get("product_picture"));

        }
    }
View Code

 

posted @ 2017-09-08 14:12  ---江北  阅读(993)  评论(0编辑  收藏  举报
TOP