SolrJava的使用
SolrJ 是为java 准备的客户端,用于操作Solr服务器的工作.
见:http://wiki.apache.org/solr/Solrj 。
另示例如下:
package org.com.solr36.test001;
import java.io.IOException;
import java.net.MalformedURLException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
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.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Before;
import org.junit.Test;
public class SolrTest01 {
private final static String URL = "http://localhost:8080/solr" ;
SolrServer httpSolrServer = null ;
@Before
public void init()
{
httpSolrServer = new HttpSolrServer(URL);
}
@Test
public void test01()
{
//1.创建SolrServer对象(HttpSolrServer, CommonsHttpSolrServer,EmbeddedSolrServer)
//在Solr3.6 以后:Deprecated. Use HttpSolrServer instead.
//new CommonsHttpSolrServer();
try {
//httpSolrServer.deleteByQuery("*:*");
//httpSolrServer.commit() ;
// 对solr 而言, 如果 id 相同,其它的属性值不相同的话,后者会更新前者。
SolrInputDocument sid = new SolrInputDocument();
sid.addField("id", "4") ; // id 是solr_home/conf/schema.xml 中的主键值,必须有,注意类型
sid.addField("name", "我是一个外国人");
sid.addField("msg_title", "这是我的第一个solr程序11111");
sid.addField("msg_content", "我的第一个solr能否运行吗222?") ;
httpSolrServer.add(sid) ;
httpSolrServer.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test02()
{
try {
List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
for(int i=5;i<10;i++)
{
SolrInputDocument sid = new SolrInputDocument();
sid.addField("id", i+"") ; // id 是solr_home/conf/schema.xml 中的主键值,必须有,注意类型
sid.addField("name", "我是一个外国人"+i);
sid.addField("title", "这是我的第一个solr程序"+i);
docs.add(sid);
}
//sid.addField("content", "我的第一个solr能否运行吗?") ;
httpSolrServer.add(docs);
httpSolrServer.commit();
//SolrParams params = new SolrParams();
//httpSolrServer.query(params )
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test03()
{
try {
List<Message> docs = new ArrayList<Message>();
for(int i=5;i<10;i++)
{
Message sid = new Message();
sid.setId(i+"");
sid.setTitle("这是我的第一个solr程序Bean"+i);
sid.setName("我是一个外国人BEAN"+i);
sid.setMsg_content(new String[]{sid.getTitle(),sid.getName()});
docs.add(sid);
}
httpSolrServer.addBeans(docs);
httpSolrServer.commit();
//SolrParams params = new SolrParams();
//httpSolrServer.query(params )
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test04()
{
//SolrParams
SolrQuery query = new SolrQuery("*"); // msg_all:222
query.setStart(0); //分页 起始
query.setRows(4) ; // 每页查多少条记录
try {
QueryResponse qresponse = httpSolrServer.query(query) ;
SolrDocumentList sorlList = qresponse.getResults();
System.out.println(sorlList.getNumFound());
for(SolrDocument sd :sorlList)
{
System.out.println(sd);
System.out.println(sd.getClass());
System.out.println(sd.getFieldValue("msg_title"));
}
} catch (SolrServerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 不常 用
*/
@Test
public void test05()
{
//SolrParams
SolrQuery query = new SolrQuery("*"); // msg_all:222
query.setStart(0); //分页 起始
query.setRows(4) ; // 每页查多少条记录
try {
QueryResponse qresponse = httpSolrServer.query(query) ;
List<Message> beans = qresponse.getBeans(Message.class);
for(Message sd :beans)
{
System.out.println(sd);
System.out.println(sd.getClass());
System.out.println(sd.getName());
}
} catch (SolrServerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 高亮显示
*/
@Test
public void test06()
{
//SolrParams
SolrQuery query = new SolrQuery("msg_all:程序"); // msg_all:222
query.setHighlight(true).setHighlightSimplePre("<span class='highlighter'>")
.setHighlightSimplePost("</span>")
.setStart(0)
.setRows(5) ;
query.setParam("hl.fl", "msg_all,msg_name,msg_content"); // hl.fl 这是一个固定值
//query.setStart(0); //分页 起始
//query.setRows(4) ; // 每页查多少条记录
try {
QueryResponse qresponse = httpSolrServer.query(query) ;
SolrDocumentList sorlList = qresponse.getResults();
System.out.println(sorlList.getNumFound());
for(SolrDocument sd :sorlList)
{
System.out.println(sd);
System.out.println(sd.getClass());
String id =sd.getFieldValue("id")+"" ;
//System.out.println(sd.getFieldValue("msg_title"));
Map<String,List<String>> maphighlighter = qresponse.getHighlighting().get(id);
if(maphighlighter!= null)
{
System.out.println(maphighlighter.get("msg_content")); // 这个msg_content一定要 store 才能查得到,否则查不到高亮。
System.out.println(maphighlighter.get("msg_all"));
}
}
} catch (SolrServerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static int fetchSize = 1000;
private static HttpSolrServer solrCore;
public void TestDataBase() throws MalformedURLException
{
solrCore = new HttpSolrServer(URL);
}
/**
* Takes an SQL ResultSet and adds the documents to solr. Does it in batches
* of fetchSize.
*
* @param rs
* A ResultSet from the database.
* @return The number of documents added to solr.
* @throws SQLException
* @throws SolrServerException
* @throws IOException
*/
public long addResultSet(ResultSet rs) throws SQLException,
SolrServerException, IOException
{
long count = 0;
int innerCount = 0;
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
ResultSetMetaData rsm = rs.getMetaData();
int numColumns = rsm.getColumnCount();
String[] colNames = new String[numColumns + 1];
/**
* JDBC numbers the columns starting at 1, so the normal java convention
* of starting at zero won't work.
*/
for (int i = 1; i < (numColumns + 1); i++)
{
colNames[i] = rsm.getColumnName(i);
/**
* If there are fields that you want to handle manually, check for
* them here and change that entry in colNames to null. This will
* cause the loop in the next section to skip that database column.
*/
// //Example:
// if (rsm.getColumnName(i) == "db_id")
// {
// colNames[i] = null;
// }
}
while (rs.next())
{
count++;
innerCount++;
SolrInputDocument doc = new SolrInputDocument();
/**
* At this point, take care of manual document field assignments for
* which you previously assigned the colNames entry to null.
*/
// //Example:
// doc.addField("solr_db_id", rs.getLong("db_id"));
for (int j = 1; j < (numColumns + 1); j++)
{
if (colNames[j] != null)
{
Object f;
switch (rsm.getColumnType(j))
{
case Types.BIGINT:
{
f = rs.getLong(j);
break;
}
case Types.INTEGER:
{
f = rs.getInt(j);
break;
}
case Types.DATE:
{
f = rs.getDate(j);
break;
}
case Types.FLOAT:
{
f = rs.getFloat(j);
break;
}
case Types.DOUBLE:
{
f = rs.getDouble(j);
break;
}
case Types.TIME:
{
f = rs.getDate(j);
break;
}
case Types.BOOLEAN:
{
f = rs.getBoolean(j);
break;
}
default:
{
f = rs.getString(j);
}
}
doc.addField(colNames[j], f);
}
}
docs.add(doc);
/**
* When we reach fetchSize, index the documents and reset the inner
* counter.
*/
if (innerCount == fetchSize)
{
solrCore.add(docs);
docs.clear();
innerCount = 0;
}
}
/**
* If the outer loop ended before the inner loop reset, index the
* remaining documents.
*/
if (innerCount != 0)
{
solrCore.add(docs);
}
return count;
}
}