JAVA操作solr的实现其实很简单,但是很多细节要注意,在实际的开发中,很多人喜欢自己封装这些基础的方法以一个全新的“面貌”出现,其实都是一回事,操作熟了自然就会想到将一些实现功能用到的方法重新封装,这也是编程进阶的表现。
SolrJ的使用
SolrJ覆盖了solr的全部功能,下面将自己在实际开发中所使用的程序粘贴出来并适当加以解释,由于本人比较菜,代码书写不是那么的精练,还请见谅。
1、 创建solrserver对象:
try {
solr = new CommonsHttpSolrServer("http://localhost:8983/solr");
solr.setConnectionTimeout(100);
solr.setDefaultMaxConnectionsPerHost(100);
solr.setMaxTotalConnections(100);
} catch (Exception e) {
System.out.println("请检查tomcat服务器或端口是否开启!");
e.printStackTrace();
}
2、 添加索引
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
for (int i = 0; i < list.size(); i++) {
Item item = list.get(i);
//设置每个字段不得为空,可以在提交索引前进行检查
if (CheckItem(item)) {
SolrInputDocument doc = new SolrInputDocument();
//在这里请注意date的格式,要进行适当的转化,上文已提到
doc.addField("id", item.getId());
…………
docs.add(doc);
}
}
try {
solr.add(docs);
//对索引进行优化
solr.optimize();
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
3、 使用bean对象添加索引
创建一个对应于solr索引的类别:
public class Item {
@Field
private String id;
…………
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
…………
public Item(){
}
}
使用数据创建bean对象列表,
try {
solr.addBeans(beansList);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
solr.optimize();
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
索引提交完毕。
4、 删除索引
据查询结果删除:
try {
//删除所有的索引
solr.deleteByQuery("*:*");
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
根据索引号删除索引:
try {
solr.deleteById(ids);
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
5、 查询
SolrJ提供的查询功能比较强大,可以进行结果中查询、范围查询、排序等。
下面是笔者封装的一个查询函数:
public static QueryResponse Search(String[] field, String[] key, int start,
int count, String[] sortfield, Boolean[] flag, Boolean hightlight) {
//检测输入是否合法
if (null == field || null == key || field.length != key.length) {
return null;
}
if (null == sortfield || null == flag || sortfield.length != flag.length) {
return null;
}
//qserver = new HttpSolrServer(url);
SolrQuery query = null;
try {
//初始化查询对象
query = new SolrQuery(field[0] + ":" + key[0]);
for (int i = 0; i < field.length; i++) {
query.addFilterQuery(field[i] + ":" + key[i]);
}
//设置起始位置与返回结果数
query.setStart(start);
query.setRows(count);
//设置排序
for(int i=0; i<sortfield.length; i++){
if (flag[i]) {
query.addSortField(sortfield[i], SolrQuery.ORDER.asc);
} else {
query.addSortField(sortfield[i], SolrQuery.ORDER.desc);
}
}
//设置高亮
if (null != hightlight) {
query.setHighlight(true); // 开启高亮组件
query.addHighlightField("title");// 高亮字段
query.setHighlightSimplePre("<font color="red">");// 标记
query.setHighlightSimplePost("</font>");
query.setHighlightSnippets(1);//结果分片数,默认为1
query.setHighlightFragsize(1000);//每个分片的最大长度,默认为100
}
} catch (Exception e) {
e.printStackTrace();
}
QueryResponse rsp = null;
try {
rsp = solr.query(query);
} catch (Exception e) {
e.printStackTrace();
return null;
}
//返回查询结果
return rsp;
}
补充一下范围查询的格式:[star t TO end],start与end是相应数据格式的值的字符串形式,“TO” 一定要保持大写!
6、 读取查询结果
DocList读取返回结果:
SolrDocumentList solrList = rsp.getResults();
Beans读取返回结果:
List<Item> tmpLists = rsp.getBeans(Item.class);
读取高亮显示结果:
rsp = Search(field, key, 0, 10, sortfield, flag, true);
if(null == rsp){
return;
}
Map<String, Map<String, List<String>>> hightlight = rsp.getHighlighting();
//Item即为上面定义的bean类
List<Item> tmpLists = rsp.getBeans(Item.class);
for (int i = 0; i < tmpLists.size(); i++) {
//hightlight的键为Item的id,值唯一,我们设置的高亮字段为title
String hlString = hightlight.get(tmpLists.get(i).getId()).get("title").toString();
if (null != hlString) {
System.out.println(hlString);
}
}
7、 Facet的一个应用:自动补全
//prefix为前缀,min为最大返回结果数
public static String[] autoComplete(String prefix, int min) {
String words[] = null;
StringBuffer sb = new StringBuffer("");
SolrQuery query = new SolrQuery("*.*");
QueryResponse rsp= new QueryResponse();
//Facet为solr中的层次分类查询
try {
query.setFacet(true);
query.setQuery("*:*");
query.setFacetPrefix(prefix);
query.addFacetField("title");
rsp = solr.query(query);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return null;
}
if(null != rsp){
FacetField ff = rsp.getFacetField("title");
List<Count> countList = ff.getValues();
if(null == countList){
return null;
}
for(int i=0; i<countList.size(); i++){
String tmp[] = countList.get(i).toString().split(" ");
//排除单个字
if(tmp[0].length()< 2){
continue;
}
sb.append(tmp[0] + " ");
min--;
if(min == 0){
break;
}
}
words = sb.toString().split(" ");
}else{
return null;
}
return words;
}
8、Solr Server与QServer
public static SolrServer getServer() {
if (server == null) {
String url = Configurations.getSolrServerUrl();
server = new ConcurrentUpdateSolrServer(url, 500, 50);
}
return server;
}
public static SolrServer getQServer() {
if (null == qserver) {
String url = Configurations.getSolrServerUrl();
qserver = new HttpSolrServer(url);
}
return qserver;
}
public void closeServer() throws Exception {
ConcurrentUpdateSolrServer concurrentUpdateSolrServer = (ConcurrentUpdateSolrServer) server;
concurrentUpdateSolrServer.shutdown();
server = null;
concurrentUpdateSolrServer = null;
}
相关推荐
solr-solrj-4.9.0.jar
apache-solr-solrj-3.5.0.jar
solr-solrj-6.6.0.jar
solr-solrj-4.4.0.jar
以下是一个简单的示例,展示了如何使用Solr-Solrj进行索引操作和中文分词: ```java SolrServer server = new HttpSolrServer("http://localhost:8983/solr/core_name"); SolrInputDocument doc = new ...
标题"solr-solrj-6.1.0"表明我们关注的是Solrj的一个特定版本,即6.1.0。这个版本可能包含了该时期Solrj的所有特性和修复的bug,对于理解和使用当时的Solrj功能至关重要。 描述中提到,Solr是一个企业级搜索应用...
这个压缩包包含了两个版本的SolrJ库:solr-solrj-4.10.3.jar和solr-solrj-5.0.0.jar。这两个版本的差异主要在于对Solr服务器的兼容性和功能改进。 首先,solr-solrj-4.10.3.jar是SolrJ的一个较旧版本,对应于Solr ...
solrJ是Java连接solr进行查询检索和索引更新维护的jar包。
solr的核心jar,大家可以一起好好学习一下,还是很优秀的
jar包,亲测可用
jar包,亲测可用
solr-solrj-4.10.3.jar。
下载后会获得名为:solr_core.4.6.0 的zip包,解压后会获得solr-core-4.6.0.jar和 solr-solrj-4.6.0.jar两个文件,搭建solr全文检索环境必须要添加的包
2. **solr-solrj-6.3.0.jar**:这个就是 SolrJ 的库文件,提供了与 Solr 服务器通信的接口和类。开发者可以使用这个库来创建 Solr 客户端实例,发送请求并接收响应,进行索引管理和查询操作。 3. **solr-langid-...
Solr,全称为Apache Solr,是一款开源的企业级全文搜索引擎,由Apache软件基金会开发并维护。它是基于Java的,因此在使用Solr之前,确保你的系统已经安装了Java 8或更高版本是至关重要的。标题"solr-7.4.0.zip"表明...
总结来说,`solr-solrj-4.10.2.jar`是用于Java应用程序与Apache Solr服务器交互的重要工具,它简化了索引管理和查询操作。了解并熟练使用SolrJ,可以帮助开发者更高效地构建和维护具有强大搜索功能的应用程序。然而...
这个名为"apache-solr-3.5.0.jar"的压缩包包含两个关键组件:`apache-solr-core-3.5.0.jar`和`apache-solr-solrj-3.5.0.jar`,它们对于成功搭建Solr 3.5.0环境至关重要。 1. `apache-solr-core-3.5.0.jar`: 这是...
在这个"solr-parent.rar"压缩包中,我们主要关注的是 Solr 的两个关键组件:Solr-Core 和 Solr-Solrj。 1. **Solr-Core**: Solr-Core 是 Solr 的核心部分,包含了索引和查询的主要功能。它提供了文档的存储、索引...
标题 "org.apache.servicemix.bundles.solr-solrj-4.6.1_1.zip" 提供的信息表明,这是一个与Apache Solr相关的Java库,具体是SolrJ的版本4.6.1,由Apache ServiceMix组织打包。SolrJ是Apache Solr的Java客户端库,它...