随着solr版本的不断升级, 差异越来越大, 从以前的 solr1.2 到现在的 solr4.3, 无论是类还是功能都有很大的变换, 为了能及时跟上新版本的步伐, 在此将新版本的使用做一个简单的入门说明:

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(); 
      
}

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)的值。

 

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 注释创建java bean。@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) 编辑

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(); 
}  
 }

Solr入门之SolrServer实例化方式的更多相关文章

  1. solrserver实例化

    以下是httpClient实例化方式,需要tomcat运行Solr服务 1.ConcurrentUpdateSolrServer实例化SolrServer,该类实例化多用于更新删除索引操作 Concu ...

  2. Hibernate入门6.Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

  3. Solr入门介绍

    solr入门案例 solr是apache下的一个全文检索引擎系统. 我们需要在服务器上单独去部署solr, 通过它的客户端工具包solrJ, 就是一个    jar包, 集成到我们项目中来调用服务器中 ...

  4. Solr学习笔记(5)—— Spring Data Solr入门

    一.Spring Data Solr简介 前面已经介绍了通过solrJ来操作solr,那么我们如何将Solr的应用集成到Spring中?Spring Data Solr就是为了方便Solr的开发所研制 ...

  5. Solr入门之(2)快速启动:第一个例子

    Solr作为一个web应用来启动,因此需要JDK支持,需要WEB容器,本文环境如下: JDK6.0或以上(环境变量设置等不再赘述) Tomcat-6.0.35或以上(自行下载) apache-solr ...

  6. Spring学习笔记之 Spring IOC容器(二) 之注入参数值,自动组件扫描方式,控制Bean实例化方式,使用注解方式

     本节主要内容:    1. 给MessageBean注入参数值    2. 测试Spring自动组件扫描方式    3. 如何控制ExampleBean实例化方式    4. 使用注解方式重构Jdb ...

  7. spring bean实例化方式

    注意:xml配置中bean节点下scope属性默认值为singleton(单例),在需要多例的情况下需要配置成prototype spring提供三种实例化方式:默认构造.静态工厂.实例工厂 一.默认 ...

  8. bean的实例化方式

    spring中bean的实例化方式有三种,1.构造器实例化,2.实例工厂实例化,3.静态工厂实例化 1.构造器实例化方式 public class bean1 { public bean1() { } ...

  9. Gson的两种实例化方式:

    2018-11-13   09:21:44 Gson的两种实例化方式: 1: 使用new Gson(); 普通实例化方式,不能配置定制化选项 Gson gson = new Gson(); 2: 通过 ...

随机推荐

  1. html常用标签有哪些?

    html看似复杂,其实常用的标签并不多,这里总共介绍一些html的常用标签 文字处理: ①标题:<h1> to <h6> ②段落:<p>文字段落</p> ...

  2. 射频识别技术漫谈(23)——ISO15693的载波、调制与编码

    射频识别技术中的通讯大多是主从式,主动方一般是读写器,被动方称为“卡片”或“标签”.到底是叫“卡片”还是“标签”,好像也没有严格的区分.习惯上可以从以下4个方面界定:一是形状,卡片通常体积较大,更像“ ...

  3. 宣布发布 Windows Azure 导入/导出服务的预览版以及 Web 和移动解决方案场景的若干增强功能

    客户评估基于云的存储解决方案时,面临的挑战之一是以经济高效.安全快速的方式从 Blob 存储区移进和移出大量数据.今天,我们很高兴地宣布发布 Windows Azure 导入/导出的预览版,这款新服务 ...

  4. 使用Linux静态库

    查看静态库.a文件包含的内容用下面的命令解压: ar x libgdal.a 然后就可以查看文件了: ls adler32.o cpl_recode.o dted_create.o gdalpamra ...

  5. JAVA 创建TXT文件,写入文件内容,读取文件内容

    [java]  view plain copy   package com.abin.facade.ws.mail.function; import java.io.BufferedReader; i ...

  6. 一些常用的Intent及intent-filter的信息

    Uri Action 功能 备注 geo:latitude,longitude Intent.ACTION_VIEW 打开地图应用程序并显示指定的经纬度   geo:0,0?q=street+addr ...

  7. Android多线程及异步处理问题

    1.问题提出 1)为何需要多线程? 2)多线程如何实现? 3)多线程机制的核心是啥? 4)到底有多少种实现方式? 2.问题分析 1)究其为啥需要多线程的本质就是异步处理,直观一点说就是不要让用户感觉到 ...

  8. use MSBuild cmd to build and deploy the database project.

    You can use the below command to implement it. SET TargetDBName="Database name" SET DataBa ...

  9. codeforces 569A Music

    codeforces  569A   Music   解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88890#pro ...

  10. python之列表生成式

    列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 1,比如:要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, ...