SolrJ实例
使用SolrJ操作Solr会比利用httpClient来操作Solr要简单。SolrJ是封装了httpClient方法,来操作solr的API的。SolrJ底层还是通过使用httpClient中的方法来完成Solr的操作。
1、 首先,你需要添加如下jar包
这些Jar包是在\dist\solrj-lib下。
?
2、 其次,建立一个简单的测试类,完成Server对象的相关方法的测试工作,代码如下:
package com.admomo.test;<!--CRLF-->
?<!--CRLF-->
import java.io.IOException;<!--CRLF-->
import java.net.MalformedURLException;<!--CRLF-->
import java.util.ArrayList;<!--CRLF-->
import java.util.Collection;<!--CRLF-->
import java.util.List;<!--CRLF-->
import org.apache.solr.client.solrj.SolrQuery;<!--CRLF-->
import org.apache.solr.client.solrj.SolrServer;<!--CRLF-->
import org.apache.solr.client.solrj.SolrServerException;<!--CRLF-->
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;<!--CRLF-->
import org.apache.solr.client.solrj.response.QueryResponse;<!--CRLF-->
import org.apache.solr.client.solrj.response.UpdateResponse;<!--CRLF-->
import org.apache.solr.common.SolrDocumentList;<!--CRLF-->
import org.apache.solr.common.SolrInputDocument;<!--CRLF-->
import org.apache.solr.common.params.ModifiableSolrParams;<!--CRLF-->
import org.apache.solr.common.params.SolrParams;<!--CRLF-->
import org.junit.After;<!--CRLF-->
import org.junit.Before;<!--CRLF-->
import org.junit.Test;<!--CRLF-->
import com.hoo.entity.Index;<!--CRLF-->
?<!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> Server TestCase<!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
public class ServerTest {<!--CRLF-->
<!--CRLF-->
private SolrServer server;<!--CRLF-->
private CommonsHttpSolrServer httpServer;<!--CRLF-->
<!--CRLF-->
private static final String DEFAULT_URL = "http://localhost:8983/solr/";<!--CRLF-->
<!--CRLF-->
@Before<!--CRLF-->
public void init() {<!--CRLF-->
try {<!--CRLF-->
server = new CommonsHttpSolrServer(DEFAULT_URL);<!--CRLF-->
httpServer = new CommonsHttpSolrServer(DEFAULT_URL);<!--CRLF-->
} catch (MalformedURLException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
@After<!--CRLF-->
public void destory() {<!--CRLF-->
server = null;<!--CRLF-->
httpServer = null;<!--CRLF-->
System.runFinalization();<!--CRLF-->
System.gc();<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
public final void fail(Object o) {<!--CRLF-->
System.out.println(o);<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> 测试是否创建server对象成功<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void server() {<!--CRLF-->
fail(server);<!--CRLF-->
fail(httpServer);<!--CRLF-->
}<!--CRLF-->
?<!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> 根据query参数查询索引<!--CRLF--><!--CRLF--><!--CRLF-->
* @param query<!--CRLF-->
*/<!--CRLF-->
public void query(String query) {<!--CRLF-->
SolrParams params = new SolrQuery(query);<!--CRLF-->
<!--CRLF-->
try {<!--CRLF-->
QueryResponse response = server.query(params);<!--CRLF-->
<!--CRLF-->
SolrDocumentList list = response.getResults();<!--CRLF-->
for (int i = 0; i < list.size(); i++) {<!--CRLF-->
fail(list.get(i));<!--CRLF-->
}<!--CRLF-->
} catch (SolrServerException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
测试运行server case方法,如果成功创建对象,那你就成功的链接到。
注意:在运行本方法之前,请启动你的solr官方自动的项目。http://localhost:8983/solr/保证能够成功访问这个工程。因为接下来的所有工作都是围绕这个solr工程完成的。如果你现在还不知道,怎么部署、发布官方solr工程,请参考前面的具体章节。
?
3、 Server的有关配置选项参数,server是CommonsHttpSolrServer的实例
server.setSoTimeout(1000); // socket read timeout<!--CRLF-->
server.setConnectionTimeout(100);<!--CRLF-->
server.setDefaultMaxConnectionsPerHost(100);<!--CRLF-->
server.setMaxTotalConnections(100);<!--CRLF-->
server.setFollowRedirects(false); // defaults to false<!--CRLF-->
// allowCompression defaults to false.<!--CRLF-->
// Server side must support gzip or deflate for this to have any effect.<!--CRLF-->
server.setAllowCompression(true);<!--CRLF-->
server.setMaxRetries(1); // defaults to 0. > 1 not recommended.<!--CRLF-->
?<!--CRLF-->
//sorlr J 目前使用二进制的格式作为默认的格式。对于solr1.2的用户通过显示的设置才能使用XML格式。<!--CRLF-->
server.setParser(new XMLResponseParser());<!--CRLF-->
?<!--CRLF-->
//二进制流输出格式<!--CRLF-->
//server.setRequestWriter(new BinaryRequestWriter());<!--CRLF-->
?
4、 利用SolrJ完成Index Document的添加操作
/**<!--CRLF-->
* <b>function:</b> 添加doc文档<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void addDoc() {<!--CRLF-->
//创建doc文档<!--CRLF-->
SolrInputDocument doc = new SolrInputDocument();<!--CRLF-->
doc.addField("id", 1);<!--CRLF-->
doc.addField("name", "Solr Input Document");<!--CRLF-->
doc.addField("manu", "this is SolrInputDocument content");<!--CRLF-->
<!--CRLF-->
try {<!--CRLF-->
//添加一个doc文档<!--CRLF-->
UpdateResponse response = server.add(doc);<!--CRLF-->
fail(server.commit());//commit后才保存到索引库<!--CRLF-->
fail(response);<!--CRLF-->
fail("query time:" + response.getQTime());<!--CRLF-->
fail("Elapsed Time:" + response.getElapsedTime());<!--CRLF-->
fail("status:" + response.getStatus());<!--CRLF-->
} catch (SolrServerException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
} catch (IOException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
}<!--CRLF-->
query("name:solr");<!--CRLF-->
}<!--CRLF-->
在apache-solr-4.0\example\solr\conf目录下的schema.xml中可以找到有关于field属性的配置,schema.xml中的field就和上面Document文档中的field(id、name、manu)对应。如果出现ERROR:unknown field 'xxxx'就表示你设置的这个field在schema.xml中不存在。如果一定要使用这个field,请你在schema.xml中进行filed元素的配置。具体请参考前面的章节。
注意:在schema.xml中配置了uniqueKey为id,就表示id是唯一的。如果在添加Document的时候,id重复添加。那么后面添加的相同id的doc会覆盖前面的doc,类似于update更新操作,而不会出现重复的数据。
?
5、 利用SolrJ添加多个Document,即添加文档集合
/**<!--CRLF-->
* <b>function:</b> 添加docs文档集合<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void addDocs() {<!--CRLF-->
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();<!--CRLF-->
<!--CRLF-->
SolrInputDocument doc = new SolrInputDocument();<!--CRLF-->
doc.addField("id", 2);<!--CRLF-->
doc.addField("name", "Solr Input Documents 1");<!--CRLF-->
doc.addField("manu", "this is SolrInputDocuments 1 content");<!--CRLF-->
<!--CRLF-->
docs.add(doc);<!--CRLF-->
<!--CRLF-->
doc = new SolrInputDocument();<!--CRLF-->
doc.addField("id", 3);<!--CRLF-->
doc.addField("name", "Solr Input Documents 2");<!--CRLF-->
doc.addField("manu", "this is SolrInputDocuments 3 content");<!--CRLF-->
<!--CRLF-->
docs.add(doc);<!--CRLF-->
<!--CRLF-->
try {<!--CRLF-->
//add docs<!--CRLF-->
UpdateResponse response = server.add(docs);<!--CRLF-->
//commit后才保存到索引库<!--CRLF-->
fail(server.commit());<!--CRLF-->
fail(response);<!--CRLF-->
} catch (SolrServerException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
} catch (IOException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
}<!--CRLF-->
query("solr");<!--CRLF-->
}<!--CRLF-->
就是添加一个List集合
?
6、 添加JavaEntity Bean,这个需要先创建一个JavaBean,然后来完成添加操作;
JavaBean:Index的代码
package com.hoo.entity;<!--CRLF-->
?<!--CRLF-->
import org.apache.solr.client.solrj.beans.Field;<!--CRLF-->
?<!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> JavaEntity Bean;Index需要添加相关的Annotation注解,便于告诉solr哪些属性参与到index中<!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
public class Index {<!--CRLF-->
//@Field setter方法上添加Annotation也是可以的<!--CRLF-->
private String id;<!--CRLF-->
@Field<!--CRLF-->
private String name;<!--CRLF-->
@Field<!--CRLF-->
private String manu;<!--CRLF-->
@Field<!--CRLF-->
private String[] cat;<!--CRLF-->
?<!--CRLF-->
@Field<!--CRLF-->
private String[] features;<!--CRLF-->
@Field<!--CRLF-->
private float price;<!--CRLF-->
@Field<!--CRLF-->
private int popularity;<!--CRLF-->
@Field<!--CRLF-->
private boolean inStock;<!--CRLF-->
<!--CRLF-->
public String getId() {<!--CRLF-->
return id;<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
@Field<!--CRLF-->
public void setId(String id) {<!--CRLF-->
this.id = id;<!--CRLF-->
}<!--CRLF-->
//getter、setter方法<!--CRLF-->
?<!--CRLF-->
public String toString() {<!--CRLF-->
return this.id + "#" + this.name + "#" + this.manu + "#" + this.cat;<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
注意上面的属性是和在apache-solr-4.0\example\solr\conf目录下的schema.xml中可以找到有关于field属性的配置对应的。如果你Index JavaBean中出现的属性在schema.xml的field配置无法找到,那么出出现unknown filed错误。
添加Bean完成doc添加操作
/**<!--CRLF-->
* <b>function:</b> 添加JavaEntity Bean<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void addBean() {<!--CRLF-->
//Index需要添加相关的Annotation注解,便于告诉solr哪些属性参与到index中<!--CRLF-->
Index index = new Index();<!--CRLF-->
index.setId("4");<!--CRLF-->
index.setName("add bean index");<!--CRLF-->
index.setManu("index bean manu");<!--CRLF-->
index.setCat(new String[] { "a1", "b2" });<!--CRLF-->
<!--CRLF-->
try {<!--CRLF-->
//添加Index Bean到索引库<!--CRLF-->
UpdateResponse response = server.addBean(index);<!--CRLF-->
fail(server.commit());//commit后才保存到索引库<!--CRLF-->
fail(response);<!--CRLF-->
} catch (SolrServerException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
} catch (IOException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
}<!--CRLF-->
queryAll();<!--CRLF-->
}<!--CRLF-->
?
7、 添加Bean集合
/**<!--CRLF-->
* <b>function:</b> 添加Entity Bean集合到索引库<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void addBeans() {<!--CRLF-->
Index index = new Index();<!--CRLF-->
index.setId("6");<!--CRLF-->
index.setName("add beans index 1");<!--CRLF-->
index.setManu("index beans manu 1");<!--CRLF-->
index.setCat(new String[] { "a", "b" });<!--CRLF-->
<!--CRLF-->
List<Index> indexs = new ArrayList<Index>();<!--CRLF-->
indexs.add(index);<!--CRLF-->
<!--CRLF-->
index = new Index();<!--CRLF-->
index.setId("5");<!--CRLF-->
index.setName("add beans index 2");<!--CRLF-->
index.setManu("index beans manu 2");<!--CRLF-->
index.setCat(new String[] { "aaa", "bbbb" });<!--CRLF-->
indexs.add(index);<!--CRLF-->
try {<!--CRLF-->
//添加索引库<!--CRLF-->
UpdateResponse response = server.addBeans(indexs);<!--CRLF-->
fail(server.commit());//commit后才保存到索引库<!--CRLF-->
fail(response);<!--CRLF-->
} catch (SolrServerException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
} catch (IOException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
}<!--CRLF-->
queryAll();<!--CRLF-->
}<!--CRLF-->
?
8、 删除索引Document
/**<!--CRLF-->
* <b>function:</b> 删除索引操作<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void remove() {<!--CRLF-->
try {<!--CRLF-->
//删除id为1的索引<!--CRLF-->
server.deleteById("1");<!--CRLF-->
server.commit();<!--CRLF-->
query("id:1");<!--CRLF-->
<!--CRLF-->
//根据id集合,删除多个索引<!--CRLF-->
List<String> ids = new ArrayList<String>();<!--CRLF-->
ids.add("2");<!--CRLF-->
ids.add("3");<!--CRLF-->
server.deleteById(ids);<!--CRLF-->
server.commit(true, true);<!--CRLF-->
query("id:3 id:2");<!--CRLF-->
<!--CRLF-->
//删除查询到的索引信息<!--CRLF-->
server.deleteByQuery("id:4 id:6");<!--CRLF-->
server.commit(true, true);<!--CRLF-->
queryAll();<!--CRLF-->
<!--CRLF-->
} catch (SolrServerException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
} catch (IOException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
?
9、 查询索引
/**<!--CRLF-->
* <b>function:</b> 查询所有索引信息<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void queryAll() {<!--CRLF-->
ModifiableSolrParams params = new ModifiableSolrParams();<!--CRLF-->
// 查询关键词,*:*代表所有属性、所有值,即所有index<!--CRLF-->
params.set("q", "*:*");<!--CRLF-->
// 分页,start=0就是从0开始,,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了。<!--CRLF-->
params.set("start", 0);<!--CRLF-->
params.set("rows", Integer.MAX_VALUE);<!--CRLF-->
<!--CRLF-->
// 排序,,如果按照id 排序,,那么将score desc 改成 id desc(or asc)<!--CRLF-->
params.set("sort", "score desc");<!--CRLF-->
?<!--CRLF-->
// 返回信息 * 为全部 这里是全部加上score,如果不加下面就不能使用score<!--CRLF-->
params.set("fl", "*,score");<!--CRLF-->
<!--CRLF-->
try {<!--CRLF-->
QueryResponse response = server.query(params);<!--CRLF-->
<!--CRLF-->
SolrDocumentList list = response.getResults();<!--CRLF-->
for (int i = 0; i < list.size(); i++) {<!--CRLF-->
fail(list.get(i));<!--CRLF-->
}<!--CRLF-->
} catch (SolrServerException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
?
10、 其他和Server有关方法
/**<!--CRLF-->
* <b>function:</b> 其他server相关方法测试<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void otherMethod() {<!--CRLF-->
fail(server.getBinder());<!--CRLF-->
try {<!--CRLF-->
fail(server.optimize());//合并索引文件,可以优化索引、提供性能,但需要一定的时间<!--CRLF-->
fail(server.ping());//ping服务器是否连接成功<!--CRLF-->
<!--CRLF-->
Index index = new Index();<!--CRLF-->
index.setId("299");<!--CRLF-->
index.setName("add bean index199");<!--CRLF-->
index.setManu("index bean manu199");<!--CRLF-->
index.setCat(new String[] { "a199", "b199" });<!--CRLF-->
<!--CRLF-->
UpdateResponse response = server.addBean(index);<!--CRLF-->
fail("response: " + response);<!--CRLF-->
<!--CRLF-->
queryAll();<!--CRLF-->
//回滚掉之前的操作,rollback addBean operation<!--CRLF-->
fail("rollback: " + server.rollback());<!--CRLF-->
//提交操作,提交后无法回滚之前操作;发现addBean没有成功添加索引<!--CRLF-->
fail("commit: " + server.commit());<!--CRLF-->
queryAll();<!--CRLF-->
} catch (SolrServerException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
} catch (IOException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
?
11、 文档查询
/**<!--CRLF-->
* <b>function:</b> query 基本用法测试<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void queryCase() {<!--CRLF-->
//AND 并且<!--CRLF-->
SolrQuery params = new SolrQuery("name:apple AND manu:inc");<!--CRLF-->
<!--CRLF-->
//OR 或者<!--CRLF-->
params.setQuery("name:apple OR manu:apache");<!--CRLF-->
//空格 等同于 OR<!--CRLF-->
params.setQuery("name:server manu:dell");<!--CRLF-->
<!--CRLF-->
//params.setQuery("name:solr - manu:inc");<!--CRLF-->
//params.setQuery("name:server + manu:dell");<!--CRLF-->
<!--CRLF-->
//查询name包含solr apple<!--CRLF-->
params.setQuery("name:solr,apple");<!--CRLF-->
//manu不包含inc<!--CRLF-->
params.setQuery("name:solr,apple NOT manu:inc");<!--CRLF-->
<!--CRLF-->
//50 <= price <= 200<!--CRLF-->
params.setQuery("price:[50 TO 200]");<!--CRLF-->
params.setQuery("popularity:[5 TO 6]");<!--CRLF-->
//params.setQuery("price:[50 TO 200] - popularity:[5 TO 6]");<!--CRLF-->
//params.setQuery("price:[50 TO 200] + popularity:[5 TO 6]");<!--CRLF-->
<!--CRLF-->
//50 <= price <= 200 AND 5 <= popularity <= 6<!--CRLF-->
params.setQuery("price:[50 TO 200] AND popularity:[5 TO 6]");<!--CRLF-->
params.setQuery("price:[50 TO 200] OR popularity:[5 TO 6]");<!--CRLF-->
<!--CRLF-->
//过滤器查询,可以提高性能 filter 类似多个条件组合,如and<!--CRLF-->
//params.addFilterQuery("id:VA902B");<!--CRLF-->
//params.addFilterQuery("price:[50 TO 200]");<!--CRLF-->
//params.addFilterQuery("popularity:[* TO 5]");<!--CRLF-->
//params.addFilterQuery("weight:*");<!--CRLF-->
//0 < popularity < 6 没有等于<!--CRLF-->
//params.addFilterQuery("popularity:{0 TO 6}");<!--CRLF-->
<!--CRLF-->
//排序<!--CRLF-->
params.addSortField("id", ORDER.asc);<!--CRLF-->
<!--CRLF-->
//分页:start开始页,rows每页显示记录条数<!--CRLF-->
//params.add("start", "0");<!--CRLF-->
//params.add("rows", "200");<!--CRLF-->
//params.setStart(0);<!--CRLF-->
//params.setRows(200);<!--CRLF-->
<!--CRLF-->
//设置高亮<!--CRLF-->
params.setHighlight(true); // 开启高亮组件<!--CRLF-->
params.addHighlightField("name");// 高亮字段<!--CRLF-->
params.setHighlightSimplePre("<font color='red'>");//标记,高亮关键字前缀<!--CRLF-->
params.setHighlightSimplePost("</font>");//后缀<!--CRLF-->
params.setHighlightSnippets(1);//结果分片数,默认为1<!--CRLF-->
params.setHighlightFragsize(1000);//每个分片的最大长度,默认为100<!--CRLF-->
?<!--CRLF-->
//分片信息<!--CRLF-->
params.setFacet(true)<!--CRLF-->
.setFacetMinCount(1)<!--CRLF-->
.setFacetLimit(5)//段<!--CRLF-->
.addFacetField("name")//分片字段<!--CRLF-->
.addFacetField("inStock");<!--CRLF-->
<!--CRLF-->
//params.setQueryType("");<!--CRLF-->
<!--CRLF-->
try {<!--CRLF-->
QueryResponse response = server.query(params);<!--CRLF-->
<!--CRLF-->
/*List<Index> indexs = response.getBeans(Index.class);<!--CRLF-->
for (int i = 0; i < indexs.size(); i++) {<!--CRLF-->
fail(indexs.get(i));<!--CRLF-->
}*/<!--CRLF-->
<!--CRLF-->
//输出查询结果集<!--CRLF-->
SolrDocumentList list = response.getResults();<!--CRLF-->
fail("query result nums: " + list.getNumFound());<!--CRLF-->
for (int i = 0; i < list.size(); i++) {<!--CRLF-->
fail(list.get(i));<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
//输出分片信息<!--CRLF-->
List<FacetField> facets = response.getFacetFields();<!--CRLF-->
for (FacetField facet : facets) {<!--CRLF-->
fail(facet);<!--CRLF-->
List<Count> facetCounts = facet.getValues();<!--CRLF-->
for (FacetField.Count count : facetCounts) {<!--CRLF-->
System.out.println(count.getName() + ": " + count.getCount());<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
} catch (SolrServerException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
?
12、 分片查询、统计
/**<!--CRLF-->
* <b>function:</b> 分片查询, 可以统计关键字及出现的次数、或是做自动补全提示<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void facetQueryCase() {<!--CRLF-->
SolrQuery params = new SolrQuery("*:*");<!--CRLF-->
<!--CRLF-->
//排序<!--CRLF-->
params.addSortField("id", ORDER.asc);<!--CRLF-->
<!--CRLF-->
params.setStart(0);<!--CRLF-->
params.setRows(200);<!--CRLF-->
?<!--CRLF-->
//Facet为solr中的层次分类查询<!--CRLF-->
//分片信息<!--CRLF-->
params.setFacet(true)<!--CRLF-->
.setQuery("*:*")<!--CRLF-->
.setFacetMinCount(1)<!--CRLF-->
.setFacetLimit(5)//段<!--CRLF-->
//.setFacetPrefix("electronics", "cat")<!--CRLF-->
.setFacetPrefix("cor")//查询manu、name中关键字前缀是cor的<!--CRLF-->
.addFacetField("manu")<!--CRLF-->
.addFacetField("name");//分片字段<!--CRLF-->
?<!--CRLF-->
try {<!--CRLF-->
QueryResponse response = server.query(params);<!--CRLF-->
<!--CRLF-->
//输出查询结果集<!--CRLF-->
SolrDocumentList list = response.getResults();<!--CRLF-->
fail("Query result nums: " + list.getNumFound());<!--CRLF-->
<!--CRLF-->
for (int i = 0; i < list.size(); i++) {<!--CRLF-->
fail(list.get(i));<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
fail("All facet filed result: ");<!--CRLF-->
//输出分片信息<!--CRLF-->
List<FacetField> facets = response.getFacetFields();<!--CRLF-->
for (FacetField facet : facets) {<!--CRLF-->
fail(facet);<!--CRLF-->
List<Count> facetCounts = facet.getValues();<!--CRLF-->
for (FacetField.Count count : facetCounts) {<!--CRLF-->
//关键字 - 出现次数<!--CRLF-->
fail(count.getName() + ": " + count.getCount());<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
fail("Search facet [name] filed result: ");<!--CRLF-->
//输出分片信息<!--CRLF-->
FacetField facetField = response.getFacetField("name");<!--CRLF-->
List<Count> facetFields = facetField.getValues();<!--CRLF-->
for (Count count : facetFields) {<!--CRLF-->
//关键字 - 出现次数<!--CRLF-->
fail(count.getName() + ": " + count.getCount());<!--CRLF-->
}<!--CRLF-->
} catch (SolrServerException e) {<!--CRLF-->
e.printStackTrace();<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
分片查询在某些统计关键字的时候还是很有用的,可以统计关键字出现的次数,可以通过统计的关键字来搜索相关文档的信息。
?
Document文档和JavaBean相互转换这里转换的Bean是一个简单的User对象
package com.admomo.entity;<!--CRLF-->
?<!--CRLF-->
import java.io.Serializable;<!--CRLF-->
import org.apache.solr.client.solrj.beans.Field;<!--CRLF-->
?<!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> User Entity Bean;所有被添加Annotation @Field 注解的属性将参与index操作<!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
public class User implements Serializable {<!--CRLF-->
?<!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF-->
private static final long serialVersionUID = 8606788203814942679L;<!--CRLF-->
?<!--CRLF-->
//@Field<!--CRLF-->
private int id;<!--CRLF-->
@Field<!--CRLF-->
private String name;<!--CRLF-->
@Field<!--CRLF-->
private int age;<!--CRLF-->
<!--CRLF-->
/**<!--CRLF-->
* 可以给某个属性重命名,likes就是solr index的属性;在solrIndex中将显示like为likes<!--CRLF-->
*/<!--CRLF-->
@Field("likes")<!--CRLF-->
private String[] like;<!--CRLF-->
@Field<!--CRLF-->
private String address;<!--CRLF-->
@Field<!--CRLF-->
private String sex;<!--CRLF-->
@Field<!--CRLF-->
private String remark;<!--CRLF-->
public int getId() {<!--CRLF-->
return id;<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
//setter 方法上面也可以<!--CRLF-->
@Field<!--CRLF-->
public void setId(int id) {<!--CRLF-->
this.id = id;<!--CRLF-->
}<!--CRLF-->
public String getName() {<!--CRLF-->
return name;<!--CRLF-->
}<!--CRLF-->
//getter、setter<!--CRLF-->
<!--CRLF-->
@Override<!--CRLF-->
public String toString() {<!--CRLF-->
return this.id + "#" + this.name + "#" + this.age + "#" + this.like + "#" + this.address + "#" + this.sex + "#" + this.remark;<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
?
测试类代码如下
package com.admomo.test;<!--CRLF-->
?<!--CRLF-->
import org.apache.solr.client.solrj.beans.DocumentObjectBinder;<!--CRLF-->
import org.apache.solr.common.SolrDocument;<!--CRLF-->
import org.apache.solr.common.SolrDocumentList;<!--CRLF-->
import org.apache.solr.common.SolrInputDocument;<!--CRLF-->
import org.apache.solr.common.SolrInputField;<!--CRLF-->
import org.junit.Test;<!--CRLF-->
import com.admomo.entity.User;<!--CRLF-->
?<!--CRLF-->
/**<!--CRLF-->
* <b>function:</b>SolrInputDocument implements Map, Iterable<!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
public class SolrInputDocumentTest {<!--CRLF-->
?<!--CRLF-->
public final void fail(Object o) {<!--CRLF-->
System.out.println(o);<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> 创建SolrInputDocument<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void createDoc() {<!--CRLF-->
SolrInputDocument doc = new SolrInputDocument();<!--CRLF-->
doc.addField("id", System.currentTimeMillis());<!--CRLF-->
doc.addField("name", "SolrInputDocument");<!--CRLF-->
doc.addField("age", 22, 2.0f);<!--CRLF-->
<!--CRLF-->
doc.addField("like", new String[] { "music", "book", "sport" });<!--CRLF-->
<!--CRLF-->
doc.put("address", new SolrInputField("guangzhou"));<!--CRLF-->
<!--CRLF-->
doc.setField("sex", "man");<!--CRLF-->
doc.setField("remark", "china people", 2.0f);<!--CRLF-->
<!--CRLF-->
fail(doc);<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> 利用DocumentObjectBinder对象将SolrInputDocument 和 User对象相互转换<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void docAndBean4Binder() {<!--CRLF-->
SolrDocument doc = new SolrDocument();<!--CRLF-->
doc.addField("id", 456);<!--CRLF-->
doc.addField("name", "SolrInputDocument");<!--CRLF-->
<!--CRLF-->
doc.addField("likes", new String[] { "music", "book", "sport" });<!--CRLF-->
<!--CRLF-->
doc.put("address", "guangzhou");<!--CRLF-->
<!--CRLF-->
doc.setField("sex", "man");<!--CRLF-->
doc.setField("remark", "china people");<!--CRLF-->
<!--CRLF-->
DocumentObjectBinder binder = new DocumentObjectBinder();<!--CRLF-->
<!--CRLF-->
User user = new User();<!--CRLF-->
user.setId(222);<!--CRLF-->
user.setName("JavaBean");<!--CRLF-->
user.setLike(new String[] { "music", "book", "sport" });<!--CRLF-->
user.setAddress("guangdong");<!--CRLF-->
<!--CRLF-->
fail(doc);<!--CRLF-->
// User ->> SolrInputDocument<!--CRLF-->
fail(binder.toSolrInputDocument(user));<!--CRLF-->
// SolrDocument ->> User<!--CRLF-->
fail(binder.getBean(User.class, doc));<!--CRLF-->
<!--CRLF-->
SolrDocumentList list = new SolrDocumentList();<!--CRLF-->
list.add(doc);<!--CRLF-->
list.add(doc);<!--CRLF-->
//SolrDocumentList ->> List<!--CRLF-->
fail(binder.getBeans(User.class, list));<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
/**<!--CRLF-->
* <b>function:</b> SolrInputDocument的相关方法<!--CRLF--><!--CRLF--><!--CRLF-->
*/<!--CRLF-->
@Test<!--CRLF-->
public void docMethod() {<!--CRLF-->
SolrInputDocument doc = new SolrInputDocument();<!--CRLF-->
doc.addField("id", System.currentTimeMillis());<!--CRLF-->
doc.addField("name", "SolrInputDocument");<!--CRLF-->
doc.addField("age", 23, 1.0f);<!--CRLF-->
doc.addField("age", 22, 2.0f);<!--CRLF-->
doc.addField("age", 24, 0f);<!--CRLF-->
<!--CRLF-->
fail(doc.entrySet());<!--CRLF-->
fail(doc.get("age"));<!--CRLF-->
//排名有用,类似百度竞价排名<!--CRLF-->
doc.setDocumentBoost(2.0f);<!--CRLF-->
fail(doc.getDocumentBoost());<!--CRLF-->
fail(doc.getField("name"));<!--CRLF-->
fail(doc.getFieldNames());//keys<!--CRLF-->
fail(doc.getFieldValues("age"));<!--CRLF-->
fail(doc.getFieldValues("id"));<!--CRLF-->
fail(doc.values());<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->