1.先搭建Solr环境,这里网上有很多例子,此处不做说明(我参考的是这个博客:点击打开链接)
2.Solr在Java项目中的使用:
(1)数据存到Solr服务器中,有2种方式:第一种是通过启动Solr之后的控制台界面上添加数据(注意添加数据的时候,field一定要和schema.xml配置文件中的有对应的,不然会报错,可以新增自己需要的field);第二种是通过代码的方式进行添加,代码如下:
public void addDoc() throws SolrServerException, IOException{
HttpSolrClient solr = new HttpSolrClient(solrUrl + "my_core");
//方式1
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "7");
doc.addField("name", "测试7");
doc.addField("description", "丑测试男7");
doc.addField("myField", "测试7");
solr.add(doc);
//方式2
Collection<Person> beans = new ArrayList<Person>();
Person p = new Person();
p.setId("6");
p.setDescription("哈哈哈");
p.setName("你猜我叫什么");
beans.add(p);
solr.addBeans(beans);
solr.commit();
solr.close();
}
(2)数据现在有了,就需要进行查询或者删除操作,代码如下:
public void querySolr() throws SolrServerException, IOException{
HttpSolrClient solr = new HttpSolrClient(solrUrl + "my_core");
SolrQuery sq = new SolrQuery();
sq.set("q", "*:*");//查询所有
// sq.set("q", "张三");//相关查询,比如某条数据某个字段含有周、星、驰三个字 将会查询出来
sq.addFilterQuery("id:[0 TO 9]");//增加过滤查询条件,id为0-9
// sq.addFilterQuery("description:演员");//增加布尔过滤条件,description字段中含有“演员”两字的数据
sq.set("df", "name");//设置默认搜索域
sq.setSort("id",SolrQuery.ORDER.asc);//参数sort,设置返回结果的排序规则
sq.setStart(0);//设置分页参数,起始页
sq.setRows(10);//每一页多少值
sq.setHighlight(true);//参数hl,设置高亮
sq.addHighlightField("name");//设置高亮的字段
sq.setHighlightSimplePre("<font color='red'>");//设置高亮的样式
sq.setHighlightSimplePost("</font>");
//获取查询结果
QueryResponse qr = solr.query(sq);
//两种结果获取:得到文档集合或者实体对象
//查询得到文档的集合
SolrDocumentList docList = qr.getResults();
System.out.println("查询结果的总数量:" +docList.getNumFound());
for (SolrDocument sd : docList) {
System.out.println("id:" + sd.get("id") +",name:" +sd.get("name") + ",description:" + sd.get("description"));
}
//得到实体对象
List<Person> list = qr.getBeans(Person.class);
if(list != null && list.size() > 0) {
for(Person per : list){
System.out.println("id:"+per.getId()+" name:"+per.getName()+" description:"+per.getDescription());
}
}
}
public void delDocById() throws SolrServerException, IOException {
HttpSolrClient solr = new HttpSolrClient(solrUrl + "my_core");
solr.deleteById("1");
solr.commit();
solr.close();
}
(3)在进行查询操作的时候,可以通过操作SolrQuery的对象来返回结果集,此时有两种写法,一种是通过该对象的getResults()方法返回SolrDocumentList,然后遍历,得到对应的信息,还有种是通过该对象的getBeans(xxx.class)方法来直接得到某个实体的集合,如果使用第二种方式,一定要主要在实体的属性字段上面添加@Field 这个注解,不然是得不到对应的信息的。当然,你也可以通过反射机制来写个工具方法,在方法里通过判断来获取对应的信息。
import org.apache.solr.client.solrj.beans.Field;
public class Person {
@Field
private String id;
@Field
private String name;
@Field
private String description;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
如果有不正确的地方,欢迎批评指正,谢谢~