设为首页 收藏本站
查看: 1407|回复: 0

[经验分享] solr入门之SolrServer实例化方式

[复制链接]

尚未签到

发表于 2015-11-12 08:02:14 | 显示全部楼层 |阅读模式
solr入门之SolrServer实例化方式

(2013-06-19 18:04:14)
转载

标签:
solr

solr4

solr入门

solr搜索

solr搭建

it

分类:solr    随着solr版本的不断升级, 差异越来越大, 从以前的 solr1.2 到现在的 solr4.3, 无论是类还是功能都有很大的变换,为了能及时跟上新版本的步伐, 在此将新版本的使用做一个简单的入门说明:
  
  Solr3.6版本
     SolrServer实例化类型有httpClient,和本地化,如果Solr服务器不在本地就用httpClient,在本地就用EmbeddedSolrServer
  SolrServer可以操作索引,包括更新删除查询等操作
  以下是httpClient实例化方式,需要tomcat运行Solr服务
  1、ConcurrentUpdateSolrServer实例化SolrServer,该类实例化多用于更新删除索引操作



ConcurrentUpdateSolrServer(StringsolrServerUrl,  
intqueueSize,  intthreadCount)



solrServerUrl是Solr服务器的地址,



queueSize缓冲区大小



threadCount 后台线程数



  2、HttpSolrServer实例化SolrServer,该类实例化多用于查询操作





HttpSolrServer(String baseURL)


baseURL是Solr的服务器地址

  3、LBHttpSolrServer实例化SolrServer,用于有多个Solr服务器,负载均衡



LBHttpSolrServer(String... solrServerUrls)  solrServerUrls是多个Solr的服务器地址,用,号分隔
  以下是本地实例化,即项目包含Solr服务,不需要tomcat运行Solr服务

EmbeddedSolrServer

private staticCoreContainer.Initializer initializer =null;
private static CoreContainercoreContainer =null;
private staticEmbeddedSolrServer server =null;
static {
      try{
          System.setProperty("solr.solr.home","D://test//solrcore//core0");
          initializer=
newCoreContainer.Initializer();
          coreContainer= initializer.initialize();
          server=
newEmbeddedSolrServer(coreContainer,"");
      }catch
(Exception e){
          e.printStackTrace();
      }
}

  Solr搜索分页
  1、SolrQuery类,此类有个方法setStart(10),当设置为10时,表示从第11记录取,默认取值为0,就是从第,1条开始
  2、setRows(10),表示取出的记录数,默认就是10条

            SolrQuery query = new SolrQuery("url_content:百色学院");

                         

                    query.setStart(10);            

               query.setRows(10);

  
  
  Solr搜索高亮
  1、SolrQuery类,此类有个方法setHighlight(true),当设置为true时,表示开启了高亮
  2、高亮设置,添加html,和设置高亮的Field

// 以下给两个字段开启了高亮,分别是name,description,     
query.addHighlightField("name"
);      
query.addHighlightField(
"description"
);      
// 以下两个方法主要是在高亮的关键字前后加上html代码     
query.setHighlightSimplePre("");      
query.setHighlightSimplePost(
"
");

  3、获取高亮内容

Map>> map = response.getHighlighting();

  Map的Key为document的Id,即你在schema.xml中设置的Id,Value为该Id对应的document的值,请听下面分解,Value也为一个Map,该Map的Key为fieldName,Value为List,这个List里面的内容该文档的高亮字段。



所以当做逻辑处理的时候,只要按照这个层次,依次把东西给取出来即可,如果取出来的东西为空,则用QueryResponse中的SolrDocument的getFieldValue(filedName)的值。


SolrJ使用
HttpSolrServer

HttpSolrServer使用HTTPClient 和solr服务器进行通信。

String url = http://localhost:8080/solr; 
SolrServer server = new HttpSolrServer(url);

HttpSolrServer 是线程安全的,建议重复使用HttpSolrServer 实例。


  HttpSorlrServer 允许设置链接属性

String url = "http://localhost:8080/solr";
HttpSolrServer server = new HttpSolrServer( url );   
server.setSoTimeout(1000);  // socket read timeout   
server.setConnectionTimeout(100);   
server.setDefaultMaxConnectionsPerHost(100);   
server.setMaxTotalConnections(100);   
server.setFollowRedirects(false);  // defaults to false   
// allowCompression defaults to false.   
// Server side must support gzip or deflate for this to have any effect.   s
erver.setAllowCompression(true);   
server.setMaxRetries(1); // defaults to 0.  > 1 not recommended.

EmbeddedSolrServer
  EmbeddedSorrServer提供和HttpSorlrServer相同的接口,它不需要http连接

//注意,下面的属性也是可以在jvm参数里面设置的   
System.setProperty("solr.solr.home", "/home/shalinsmangar/work/oss/branch-1.3/example/solr");  
CoreContainer.Initializer initializer = new CoreContainer.Initializer();  
CoreContainer coreContainer = initializer.initialize();   
EmbeddedSolrServer server = new EmbeddedSolrServer(coreContainer, "");   

  如果你想要使用 Multicore 特性,那么你可以这样使用:

  File home = new File( getSolrHome() );     
File f = new File( home, "solr.xml" );   
multicore.load( getSolrHome(), f );      
EmbeddedSolrServer server = new EmbeddedSolrServer( multicore, "core name as defined in solr.xml" );

  如果你在你的项目中内嵌solr服务,这将是一个不错的选择。无论你能否使用http,它都提供相同的接口

用法
     solrj被设计成一个可扩展的框架,用以向solr服务器提交请求,并接收回应。
    我们已经将最通用的一些命令封装在了solrServer类中了。

Adding Data to Solr添加DOC到Solr索引
     首先需要获得一个server的实例,

SolrServer server = getSolrServer();

  如果,你使用的是一个远程的solrServer的话呢,你或许会这样来实现getSolrServer()这个方法:

public SolrServer getSolrServer(){   return new HttpSolrServer(url); }

  如果,你使用的是一个本地的solrServer的话,你或许会这样来实现getSolrServer()方法:

public SolrServer getSolrServer(){     //the instance can be reused     return new EmbeddedSolrServer(); }

  如果,你在添加数据之前,想清空现有的索引,那么你可以这么做:

server.deleteByQuery( "*:*" );// delete everything!

  构造一个document

    SolrInputDocument doc1 = new SolrInputDocument();     
doc1.addField( "id", "id1", 1.0f );     
doc1.addField( "name", "doc1", 1.0f );     
doc1.addField( "price", 10 );

  构造另外一个文档,每个文档都能够被独自地提交给solr,但是,批量提交是更高效的。每一个对SolrServer的请求都是http请求,当然对于EmbeddedSolrServer来说,是不一样的。

    SolrInputDocument doc2 = new SolrInputDocument();     
doc2.addField(
"id", "id2", 1.0f
);     
doc2.addField(
"name", "doc2", 1.0f
);     
doc2.addField(
"price", 20 );

  构造一个文档的集合

    Collection docs = new  ArrayList();     
docs.add( doc1 );     
docs.add( doc2 );


  将documents提交给solr

  server.add( docs );

  提交一个commit

  server.commit();

  在添加完documents后,立即做一个commit,你可以这样来写你的程序:

    UpdateRequest req = new UpdateRequest();      
req.setAction( UpdateRequest.ACTION.COMMIT,
false, false
);     
req.add( docs );     
UpdateResponse rsp
= req.process( server );  

Directly adding POJOs to Solr
  使用 java 注释创建javabean。@Field ,可以被用在域上,或者是setter方法上。如果一个域的名称跟bean的名称是不一样的,那么在java注释中填写别名,具体的,可以参照下面的域categories

import org.apache.solr.client.solrj.beans.Field;   
public class
Item {     
@Field   
String id;     
@Field(
"cat"
)     
String[] categories;      
@Field   
List
features;   
}


  java注释也可以使用在setter方法上,如下面的例子:

  @Field("cat")   
public void setCategory(String[] c){        

this
.categories = c;   
}


  创建bean实例

   Item item = new Item();     
item.id
= "one"
;     
item.categories
=  new
String[] { "aaa", "bbb", "ccc" };

  添加给Solr

server.addBean(item);

  将多个bean提交给solr

List beans ;   
//
add Item objects to the list   
server.addBeans(beans);   

  注意: 你可以重复使用SolrServer,这样可以提高性能。
  

Reading Data from Solr搜索
  获取solrserver的实例

SolrServer server = getSolrServer();

  构造 SolrQuery

    SolrQuery query = new SolrQuery();     
query.setQuery(
"*:*"
);     
query.addSortField(
"price", SolrQuery.ORDER.asc );

  向服务器发出查询请求

QueryResponse rsp = server.query( query );   

  获取结果。

SolrDocumentList docs = rsp.getResults();

  想要以javabean的方式获取结果,那么这个javabean必须像之前的例子一样有java注释

List beans = rsp.getBeans(Item.class);

高级用法
       solrJ 提供了一组API,来帮助我们创建查询,下面是一个faceted query的例子。

SolrServer server = getSolrServer();   
SolrQuery solrQuery
= new
  SolrQuery().                 
setQuery(
"ipod"
).                 
setFacet(
true
).                 
setFacetMinCount(
1
).               
setFacetLimit(
8
).               
addFacetField(
"category"
).                 
addFacetField(
"inStock"
);   
QueryResponse rsp
= server.query(solrQuery);

  所有的 setter/add 方法都是返回它自己本身的实例,所以就像你所看到的一样,上面的用法是链式的

posted @ 2012-05-24 17:38 浪浪仔 阅读(99) 评论(0)
编辑
Solr入门之SolrServer实例化方式  Solr3.6版本
  SolrServer实例化类型有httpClient,和本地化,如果Solr服务器不在本地就用httpClient,在本地就用EmbeddedSolrServer
  SolrServer可以操作索引,包括更新删除查询等操作
  以下是httpClient实例化方式,需要tomcat运行Solr服务
  1、ConcurrentUpdateSolrServer实例化SolrServer,该类实例化多用于更新删除索引操作

ConcurrentUpdateSolrServer(String solrServerUrl,  int queueSize,  int threadCount)

solrServerUrl是Solr服务器的地址,

queueSize缓冲区大小

threadCount 后台线程数


  2、HttpSolrServer实例化SolrServer,该类实例化多用于查询操作



HttpSolrServer(String baseURL)

baseURL是Solr的服务器地址

  3、LBHttpSolrServer实例化SolrServer,用于有多个Solr服务器,负载均衡

LBHttpSolrServer(String... solrServerUrls)

  solrServerUrls是多个Solr的服务器地址,用,号分隔
  以下是本地实例化,即项目包含Solr服务,不需要tomcat运行Solr服务

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://test//solrcore//core0");              
initializer = new CoreContainer.Initializer();              
coreContainer = initializer.initialize();               
server = new EmbeddedSolrServer(coreContainer, "");           
} catch (Exception e) {              
e.printStackTrace();         
}    
 }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138091-1-1.html 上篇帖子: Solr安装异常:SolrException: Error loading class 'solr.VelocityResponseWriter' 下篇帖子: 1、solr的安装启动及运行
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表