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

前言

经过前面的学习,我们知道了solr 基本配置和概念,下面看看java 里边是怎么实现的,在这个之前,要先把我们的solr服务开启。

引入jar包

我在springboot 项目里测试的,所有只需要引入一个 starter组件就可以了,里边已经包含了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("");
            query.setHighlightSimplePost(""); // 高亮的格式,和页面的基本是一样的

            // 查询索引库
            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();
        }
    }
}

你可能感兴趣的:(solr)