• [ solr入门 ] 利用solrJ进行检索


    solrJ可以看成是solr的java版客户端,提供基本的索引维护、检索等功能。

    solrJ和solr服务端有两种“沟通”方式:

    第一,利用http进行通信。

    第二,直接访问solrCore(solr配置文件、索引文件等),不需要http通信(without http)。

    solrJ的SolrServer类结构如下图所示:

    EmbeddedSolrServer是第二种方式,CommonsHttpSolrServer,LBHttpSolrServer是第一种方式,

    其中LBHttpSolrServer是在CommonsHttpSolrServer的基础上提供了负载均衡的功能(load Balanced)。

    在很多应用场景下,我们基本都会选择CommonsHttpSolrServer(LBHttpSolrServer)的方式。最近笔者有这样一个需求,在异构平台上,有多种语言开发的系统都需要对基础数据进行检索,如果每个系统都针对性的开发一个客户端,主要缺陷是紧耦合。因此笔者考虑在solr的基础上开发一套标准的webService接口发布服务,如果在solrCore的基础上进行调整,调整量太大,如果借助solrJ的CommonsHttpSolrServer与solrServer进行沟通,那么就会多走一次http。最后发现EmbeddedSolrServer可以解决这个问题。

    然后目前EmbeddedSolrServer也有一些问题需要处理,例如:multiCore、load Balanced等。

    下面我们从检索入手,初步了解solrJ的使用方法。

    第一步:建立solrJ客户端的“通讯员”(CommonsHttpSolrServer)

    SolrServer server = new CommonsHttpSolrServer( url );
    

    第二步:检索

    方式一:借助SolrRequestParsers解析“检索字符串”进行检索

    public void query01(String queryString) {
    		SolrParams solrParams = SolrRequestParsers
    				.parseQueryString(queryString);
    		try {
    			QueryResponse rsp = solr.query(solrParams);
    			List<PatentBean> results = rsp.getBeans(PatentBean.class);
    			for (PatentBean bean : results)
    				System.out.println(bean.toString());
    		} catch (SolrServerException e) {
    			e.printStackTrace();
    		}
    	}

    queryString:String queryString = "q=ti:汽车&version=2.2&start=0&rows=10&indent=on";

    这种方式简单,但是在应用中通过拼接字符串是比较憋足的,所以这种方式应用较少。

    注意:

    List<PatentBean> results = rsp.getBeans(PatentBean.class);Bean这种方式,不管索引维护,还是检索都十分方便。

    方式二:借助ModifiableSolrParams对象接收查询条件进行检索

    public void query02(String queryString) {
    		ModifiableSolrParams solrParams = new ModifiableSolrParams();
    		solrParams.add("q", queryString);
    		solrParams.add("start", "0");
    		solrParams.add("rows", "10");
    		try {
    			QueryResponse rsp = solr.query(solrParams);
    			List<PatentBean> results = rsp.getBeans(PatentBean.class);
    			for (PatentBean bean : results)
    				System.out.println(bean.toString());
    		} catch (SolrServerException e) {
    			e.printStackTrace();
    		}
    	}
    

    这种方式和第一种类似,如果第一种方式用个StringBuilt接收参数,那么就没什么两样了! 

    方式三:借助solrQuery对象接收查询条件进行检索

    public void query02(String queryString) {
    		SolrQuery query = new SolrQuery();
    		query.setQuery(queryString);
    		query.setStart(0);
    		query.setRows(10);
    		QueryResponse rsp;
    		try {
    			rsp = solr.query(query);
    			List<PatentBean> results = rsp.getBeans(PatentBean.class);
    			for (PatentBean bean : results)
    				System.out.println(bean.toString());
    		} catch (SolrServerException e) {
    			e.printStackTrace();
    		}
    	}
    

    添加高亮效果:

    query.setHighlight(true).setHighlightSnippets(1);
    query.setParam("hl.fl", "ti");
    

    使用EmbeddedSolrServer进行检索

    创建EmbeddedSolrServer对象,如下:

    private static CoreContainer.Initializer initializer = null;
    	private static CoreContainer coreContainer = null;
    	private static EmbeddedSolrServer server = null;
    	static {
    		try {
    			System.setProperty("solr.solr.home", "D:/solrHome/example/solr02");
    			initializer = new CoreContainer.Initializer();
    			coreContainer = initializer.initialize();
    			server = new EmbeddedSolrServer(coreContainer, "");
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    

     参考:

    http://wiki.apache.org/solr/SolJava

    http://wiki.apache.org/solr/Solrj

  • 相关阅读:
    对var和let作用域用闭包的特性做最好的解释
    Js函数作用域
    问题记录
    Git学习
    React-router BrowserRouter导致axios请求时会重复url中的某些字段
    leetcode python 032 识别最长合法括号
    leetcode python 030 Substring with Concatenation of All Words
    n阶楼梯,一次走1,2,3步,求多少种不同走法
    leetcode python 012 hard 合并k个有序链表
    leetcode python 011
  • 原文地址:https://www.cnblogs.com/huangfox/p/2348949.html
Copyright © 2020-2023  润新知