solr配套有好多的客户端用于操作索引库,下面我们来讲如何用solrj去操作solr索引库。
一、认识solrj
solrj是solr的java客户端,用于访问solr索引库。它提供了添加、删除、查询、优化等功能。
二、下载
百度、google以下solrj下载,你会发现根本就没有,那么我们该到哪儿下载呢?其实,它是集成到solr压缩包里的,解压文件后,有个目录/dist/solrj-lib,里面就存放了solrj所用到的jar,你把这些jar都添加到你的classpath就ok。
如果你是使用Maven来构建项目,添加以下代码到你的pom.xml配置文件中:
<dependency>
<artifactId>solr-solrj</artifactId>
<groupId>org.apache.solr</groupId>
<version>1.4.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.5.6</version>
</dependency>
下面是具体使用Solr4j的工具类
package
x.y.z;
import
java.io.IOException;
import
java.util.ArrayList;
import
java.util.LinkedList;
import
java.util.List;
import
java.util.Map;
import
my.VirtualProxy;
import
org.apache.log4j.Logger;
import
org.apache.solr.client.solrj.SolrQuery;
import
org.apache.solr.client.solrj.SolrServer;
import
org.apache.solr.client.solrj.SolrServerException;
import
org.apache.solr.client.solrj.impl.HttpSolrServer;
import
org.apache.solr.client.solrj.response.FacetField;
import
org.apache.solr.client.solrj.response.FacetField.Count;
import
org.apache.solr.client.solrj.response.QueryResponse;
import
org.apache.solr.common.SolrDocument;
import
org.apache.solr.common.SolrDocumentList;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Repository;
import
org.springframework.stereotype.Service;
import
org.springframework.util.StringUtils;
import
x.y.z.framework.search.vo.Content;
import
x.y.z.framework.search.vo.Search;
//
@Repository & @Autowired is use spring annotations
@Repository
public
class
SearchDAOImpl
implements
SearchDAO
{
private
static
Logger logger = Logger.getLogger(SearchDAOImpl.
class
);
//
@Autowired
private
HttpSolrServer solrServer;
@Override
public
void
init()
{
//
TODO Auto-generated method stub
String SearchService_Url = "http://localhost:8983/solr"
;
this
.solrServer =
new
HttpSolrServer(SearchService_Url);
try
{
solrServer.ping();
}
catch
(Exception e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public
void
init(String url)
{
//
TODO Auto-generated method stub
this
.solrServer =
new
HttpSolrServer(url);
try
{
solrServer.ping();
}
catch
(Exception e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public
boolean
ping()
{
//
TODO Auto-generated method stub
try
{
if
(
this
.solrServer !=
null
)
{
this
.solrServer.ping();
return
true
;
}
else
{
logger.debug(
"Manipulate null object.SolrServer must init."
);
return
false
;
}
}
catch
(Exception e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
return
false
;
}
}
@Override
public
void
addIndex(Content add)
{
//
TODO Auto-generated method stub
}
@Override
public
void
deleteIndex(Content delete)
{
//
TODO Auto-generated method stub
}
@Override
public
void
changeIndex(Content old_index, Content new_index)
{
//
TODO Auto-generated method stub
}
@Override
public
Search query(String query,
int
start,
int
rows,String SortField,
boolean
Highlight)
{
//
TODO Auto-generated method stub
if
(
this
.solrServer !=
null
)
{
SolrQuery solrQuery
=
new
SolrQuery();
solrQuery.setQuery(query);
//
start the query and show the rows number
solrQuery.setStart(start);
solrQuery.setRows(rows);
//
Sequence
//
Sequence for the asscet time and Weights for the sort result
//
the seq must not a null value
solrQuery.addSortField(SortField, SolrQuery.ORDER.asc);
//
high light
solrQuery.setHighlight(
true
);
solrQuery.addHighlightField(
"name"
);
solrQuery.addHighlightField(
"id"
);
solrQuery.addHighlightField(
"title"
);
solrQuery.addHighlightField(
"features"
);
solrQuery.addHighlightField(
"content"
);
solrQuery.setHighlightSimplePre(
"<font color='red'>"
);
solrQuery.setHighlightSimplePost(
"</font>"
);
solrQuery.setHighlightSnippets(
1);
//
结果分片数,默认为1
solrQuery.setHighlightFragsize(1000);
//
每个分片的最大长度,默认为100
solrQuery.setFacet(
true
).setFacetMinCount(1).setFacetLimit(5).addFacetField("id").addFacetField("inStock"
);
solrQuery.setFacet(
true
).setFacetMinCount(1).setFacetLimit(5).addFacetField("content").addFacetField("inStock"
);
QueryResponse queryResponse
=
null
;
try
{
queryResponse
=
solrServer.query(solrQuery);
SolrDocumentList solrDocumentList
=
queryResponse.getResults();
return
new
Search(queryResponse,solrDocumentList);
}
catch
(SolrServerException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
logger.debug(
"The Search Server is null value."
);
}
return
null
;
}
@Override
public
void
close()
{
//
TODO Auto-generated method stub
if
(
this
.solrServer !=
null
)
{
this
.solrServer.shutdown();
}
else
{
logger.debug(
"Manipulate null object.SolrServer must init."
);
}
}
@Override
public
List<Content>
queryAll()
{
//
TODO Auto-generated method stub
List<Content> list =
new
ArrayList<Content>
();
if
(
this
.solrServer !=
null
)
{
SolrQuery solrQuery
=
new
SolrQuery();
//
String query = "GB";
String query = "*:*"
;
solrQuery.setQuery(query);
//
add the
Integer start = 0
;
Integer rows
= 20
;
solrQuery.setStart(start);
solrQuery.setRows(rows);
//
Sequence
//
Sequence for the asscet time and Weights for the sort result
//
the seq must not a null value
//
solrQuery.addSortField("name", SolrQuery.ORDER.asc);
solrQuery.addSortField("id"
, SolrQuery.ORDER.asc);
//
high light
solrQuery.setHighlight(
true
);
solrQuery.addHighlightField(
"name"
);
solrQuery.addHighlightField(
"id"
);
solrQuery.addHighlightField(
"title"
);
solrQuery.addHighlightField(
"features"
);
solrQuery.addHighlightField(
"content"
);
solrQuery.setParam(
"hl.fl", "content"
);
solrQuery.setHighlightSimplePre(
"<font color=\"red\">"
);
solrQuery.setHighlightSimplePost(
"</font>"
);
solrQuery.setFacet(
true
).setFacetMinCount(1).setFacetLimit(5).addFacetField("id"
);
solrQuery.setFacet(
true
).setFacetMinCount(1).setFacetLimit(5).addFacetField("content"
);
solrQuery.setFacet(
true
).setFacetMinCount(1).setFacetLimit(5).addFacetField("features"
);
try
{
QueryResponse queryResponse
=
solrServer.query(solrQuery);
SolrDocumentList docs
=
queryResponse.getResults();
System.out.println(
"doc number found :" +
docs.getNumFound());
System.out.println(
"doc max score :" +
docs.getMaxScore());
for
(SolrDocument doc : docs)
{
String name
= (String) doc.getFieldValue("name"
);
String id
= (String) doc.getFieldValue("id"
);
ArrayList features
= (ArrayList)doc.getFieldValue("features"
);
//
to add the list value must use the temp object
Content vo =
new
Content();
//
Set the vo object
vo.setId(id);
vo.setName(name);
vo.setFeatures(features);
list.add(vo);
//
Print the list value
System.out.println("id :" +
id);
System.out.println(
"name :" +
name);
if
(features !=
null
)
{
for
(Object feature : features.toArray())
{
System.out.println(
"feature :" +
feature.toString());
}
}
}
}
catch
(SolrServerException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
logger.debug(
"The Search Server is null value."
);
}
return
list;
}
@Override
public
int
queryTotal(String query)
{
//
TODO Auto-generated method stub
if
(
this
.solrServer !=
null
)
{
SolrQuery solrQuery
=
new
SolrQuery();
solrQuery.setQuery(query);
QueryResponse queryResponse;
try
{
queryResponse
=
solrServer.query(solrQuery);
return
queryResponse.getResults().size();
}
catch
(SolrServerException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
return
0
;
}
/*
* (non-Javadoc)
* @Warning it will clear ALL the index
* @see com.cfp.framework.search.dao.SearchDAO#clearAll()
*/
@Override
public
void
clearAll()
{
//
TODO Auto-generated method stub
try
{
solrServer.deleteByQuery(
"*:*"
);
solrServer.commit();
}
catch
(SolrServerException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
catch
(IOException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
}

