Solr

来源:互联网 发布:日本青少年犯罪 知乎 编辑:程序博客网 时间:2024/06/07 05:10
package test;


import java.io.IOException;
import java.util.List;


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 com.alibaba.fastjson.JSONObject;


public class SolrTest {
    public static void main(String[] args) throws Exception {
        SolrTest solr = new SolrTest();
        solr.createSolrServer();
        solr.addDoc();
       /* solr.deleteDocumentById();*/
        /*solr.querySolr();*/
    }


    // 指定solr服务器的地址
    private final static String SOLR_URL = "http://172.16.17.11:10180/solr/";
    private final static String COLLECTION = "data_interface_test";


    /**
     * 创建SolrServer对象
     * 该对象有两个可以使用,都是线程安全的 
     * 1、CommonsHttpSolrServer:启动web服务器使用的,通过http请求的
     * 2、EmbeddedSolrServer:内嵌式的,导入solr的jar包就可以使用了 
     * 3、solr 4.0版本之后好像添加了不少东西,其中CommonsHttpSolrServer这个类改名为HttpSolrClient
     * 
     * @return
     */
    @SuppressWarnings("deprecation")
    public HttpSolrClient createSolrServer() {
        HttpSolrClient solr = null;
        solr = new HttpSolrClient(SOLR_URL);
        return solr;
    }


    /**
     * 往索引库添加文档
     * 
     * @throws IOException
     * @throws SolrServerException
     */
    public void addDoc() throws SolrServerException, IOException {
        // 构造一篇文档
        SolrInputDocument document = new SolrInputDocument();
        // 往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义
        document.addField("id", "8");
        document.addField("name", "周新星");
        document.addField("description", "一个灰常牛逼的军事家");
        // 获得一个solr服务端的请求,去提交 ,选择具体的某一个solr core
        @SuppressWarnings("deprecation")
        HttpSolrClient solr = new HttpSolrClient(SOLR_URL + COLLECTION);
        solr.add(document);
        solr.commit();
        solr.close();
    }


    /**
     * 根据id从索引库删除文档
     */
    public void deleteDocumentById() throws Exception {
        // 选择具体的某一个solr core
        @SuppressWarnings("deprecation")
        HttpSolrClient server = new HttpSolrClient(SOLR_URL + COLLECTION);
        // 删除文档
        server.deleteById("8");
        // 删除所有的索引
        // solr.deleteByQuery("*:*");
        // 提交修改
        server.commit();
        server.close();
    }


    /**
     * 查询
     * 
     * @throws Exception
     */
    public void querySolr() throws Exception {
        @SuppressWarnings({ "deprecation", "resource" })
        HttpSolrClient solrServer = new HttpSolrClient(SOLR_URL + COLLECTION);
        SolrQuery query = new SolrQuery();
        // 下面设置solr查询参数
         query.set("q", "*:*");// 参数q 查询所有
       // query.set("q", "周星驰");// 相关查询,比如某条数据某个字段含有周、星、驰三个字 将会查询出来 ,这个作用适用于联想查询


        // 参数fq, 给query增加过滤查询条件
        query.addFilterQuery("id:489094a7-10b6-4027-9f3c-15bc46cb40cb");// id为0-4


        // 给query增加布尔过滤条件
        // query.addFilterQuery("description:演员"); //description字段中含有“演员”两字的数据


        // 参数df,给query设置默认搜索域
       // query.set("df", "name");


        // 参数sort,设置返回结果的排序规则
       // query.setSort("id", SolrQuery.ORDER.desc);


        // 设置分页参数
        query.setStart(0);
        query.setRows(10);// 每一页多少值


        // 参数hl,设置高亮
        query.setHighlight(true);
        // 设置高亮的字段
        query.addHighlightField("name");
        // 设置高亮的样式
        query.setHighlightSimplePre("<font color='red'>");
        query.setHighlightSimplePost("</font>");


        // 获取查询结果
        QueryResponse response = solrServer.query(query);
        // 两种结果获取:得到文档集合或者实体对象


        // 查询得到文档的集合
        SolrDocumentList solrDocumentList = response.getResults();
        System.out.println("通过文档集合获取查询的结果");
        System.out.println("查询结果的总数量:" + solrDocumentList.getNumFound());
        // 遍历列表
        for (SolrDocument doc : solrDocumentList) {
            System.out.println("id:" + doc.get("id") + "   name:" + doc.get("level_s") + "    description:"
                    + doc.get("loginTime_l"));
        }


        // 得到实体对象
        List<JSONObject> tmpLists = response.getBeans(JSONObject.class);
        if (tmpLists != null && tmpLists.size() > 0) {
            System.out.println("通过文档集合获取查询的结果");
            for (JSONObject per : tmpLists) {
                System.out.println("id:" + per.get("id") + "   name:" + per.get("level_s") + "    description:" + per.get("loginTime_l"));
            }
        }
    }
}
原创粉丝点击