前提条件:添加相关solrj jar包
1.获取HttpSolrClient public class SolrServer { private static HttpSolrClient server = null; private static String url = “http://localhost:8080/solr/solr_test“;
/** 获取server*/
public static HttpSolrClient getSolrClient(){
if(null == server){
server = new HttpSolrClient(url);
server.setAllowCompression(true);
server.setFollowRedirects(true);
server.setMaxTotalConnections(10000);
server.setDefaultMaxConnectionsPerHost(1000);
server.setSoTimeout(60000);//1 minute
}
return server;
}
}
注:HttpSolrClient有两种实现方式: SolrClient client = new HttpSolrClient(“http://my-solr-server:8983/solr/core1“); QueryResponse resp = client.query(new SolrQuery(“:“)); SolrClient client = new HttpSolrClient(“http://my-solr-server:8983/solr“); QueryResponse resp = client.query(“core1”, new SolrQuery(“:“)); 注:第一种定位到相应的core地址;第二种则在使用的时候才定位到相应的core地址
2.add
HttpSolrClient 下有两种类型的add 第一种: UpdateResponse add(SolrInputDocument doc) Adds a single document 添加一个简单的SolrInputDocument ,代码如下: HttpSolrClient solrClient = SolrServer.getSolrClient();
SolrInputDocument doc = new SolrInputDocument();
doc.setField("id", "1001");
doc.setField("name", "laowang");
doc.setField("score", "99");
solrClient.add(doc);
solrClient.commit();
注意:相关Field字段需提前定义在{tomcat-home}/solr/solr-test/conf/schema.xml文件中
第二种:(注意:该方法更常用) UpdateResponse addBean(Object obj) Adds a single bean The bean is converted to a SolrInputDocument by the client’s DocumentObjectBinder
注:可以直接添加实体类对象,避免写大量的Field 代码如下:
首先定义一个实体类 public void addBean(){ HttpSolrClient solrClient = SolrServer.getSolrClient();
User u = new User(1003,"wangwu",50);
try {
solrClient.addBean(u);
solrClient.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
方法调用如下:
public class User { @Field private int id; @Field private String name; @Field(value=”score_i”) private int score;
以上两种均有添加List的方式
3.delete
public void delete(){ HttpSolrClient client = SolrServer.getSolrClient();
try {
//第一种方式,根据ID删除
UpdateResponse deleteById = client.deleteById("1001");
//第二种方式,根据条件删除
UpdateResponse deleteByQuery = client.deleteByQuery("id:1001");
client.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
注:还有可以进行批量删除的方法、根据查询删除的方法 UpdateResponse deleteById(List ids) Deletes a list of documents by unique ID UpdateResponse deleteByQuery(String query) Deletes documents from the index based on a query
4.query
public void query(){
HttpSolrClient client = SolrServer.getSolrClient();
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
//添加条件
query.setQuery("id:1000 OR id:1001");
// query.setFields(“id”);
query.setStart(0);
query.setRows(5);
try {
QueryResponse query2 = client.query(query);
//第一种方式,获取document,然后逐字段获取
SolrDocumentList results = query2.getResults();
for (int i = 0; i < results.size(); i++) {
SolrDocument solrDocument = results.get(i);
System.out.println("id -> "+solrDocument.getFieldValue("id"));
System.out.println("name -> "+solrDocument.getFieldValue("name"));
System.out.println("score -> "+solrDocument.getFieldValue("score_i"));
System.out.println("*********");
}
//第二种方式,获取bean对象,然后逐字段获取
List beans = query2.getBeans(User.class);
for (User user : beans) {
System.out.println("id -> "+user.getId());
System.out.println("name -> "+user.getName());
System.out.println("score -> "+user.getScore());
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
注:常用查询参数说明 q-查询字符串,必须指定 query.set(“q”, “:“); fl-返回哪些字段内容,用逗号或空格分开 query.set(“fl”, “id,name”); start-返回第一条记录在完整找到结果中的偏移量,0开始 query.setStart(0); rows-返回指定结果中最多有多少条记录,配合start来实现分页 query.setRows(5); sort-排序,asc升序、desc降序,默认降序 query.addSort(“score_i”, ORDER.desc); wt-指定输出格式,可以有xml,json,html等
以下为solr检索运算符:指定字段查指定值,如返回所有值 : ? 任意单个字符的通配 如: query.setQuery(“name:laowan?”); * 任意多个字符的通配,如: query.setQuery(“name:laowa*”);
布尔操作符:AND OR && || query.setQuery(“name:laowang or zhaoliu”) [ ] 包含检索范围,如检索某段时间范围 包含头尾 ,score_i:[50 TO 110] 则检索score在50-110之内的,包含50和110 { } 包含检索范围,不包含头尾,如 score_i:{50 TO 110} 则检索score在50-110之内的
另:下一篇会发表有关于Solr集群相关内容。。所有内容经得起测试