SolrJ覆盖了solr的全部功能,下面将自己在实际开发中所使用的程序粘贴出来并适当加以解释,由于本人比较菜,代码书写不是那么的精练,还请见谅。
1、 创建solrserver对象: try { solr = newCommonsHttpSolrServer("http://localhost:8983/solr"); solr.setConnectionTimeout(100); solr.setDefaultMaxConnectionsPerHost(100); solr.setMaxTotalConnections(100); } catch (Exception e) { System.out.println("请检查tomcat服务器或端口是否开启!"); e.printStackTrace(); }
2、 添加索引 Collection<SolrInputDocument>docs = newArrayList<SolrInputDocument>(); for (int i = 0; i < list.size(); i++) { Item item = list.get(i); //设置每个字段不得为空,可以在提交索引前进行检查 if (CheckItem(item)) { SolrInputDocument doc = new SolrInputDocument(); //在这里请注意date的格式,要进行适当的转化,上文已提到 doc.addField("id", item.getId()); ………… docs.add(doc); } }
try { solr.add(docs); //对索引进行优化 solr.optimize(); solr.commit(); } catch (Exception e) { e.printStackTrace(); } 3、 使用bean对象添加索引 创建一个对应于solr索引的类别: public class Item { @Field private String id; ………… public void setId(String id) { this.id = id; } public String getId() { return id; } ………… public Item(){ } }
使用数据创建bean对象列表, try{ solr.addBeans(beansList); } catch (Exception e) { e.printStackTrace(); } finally { try { solr.optimize(); solr.commit(); } catch (Exception e) { e.printStackTrace(); } } 索引提交完毕。
4、 删除索引 据查询结果删除: try{ //删除所有的索引 solr.deleteByQuery("*:*"); solr.commit(); } catch (Exception e) { e.printStackTrace(); }
根据索引号删除索引: try { solr.deleteById(ids); solr.commit(); } catch (Exception e) { e.printStackTrace(); }
5、 查询 SolrJ提供的查询功能比较强大,可以进行结果中查询、范围查询、排序等。 下面是笔者封装的一个查询函数: - public static QueryResponse Search(String[] field, String[] key,int start,
- int count, String[] sortfield, Boolean[] flag, Boolean hightlight){
- //检测输入是否合法
- if (null == field || null == key || field.length != key.length){
- return null;
- }
- if (null == sortfield || null == flag || sortfield.length !=flag.length) {
- return null;
- }
- SolrQuery query = null;
- try {
- //初始化查询对象
- query = new SolrQuery(field[0] + ":" + key[0]);
- for (int i = 0; i < field.length; i++) {
- query.addFilterQuery(field + ":" + key);
- }
- //设置起始位置与返回结果数
- query.setStart(start);
- query.setRows(count);
- //设置排序
- for(int i=0; i<sortfield.length; i++){
- if (flag) {
- query.addSortField(sortfield, SolrQuery.ORDER.asc);
- } else {
- query.addSortField(sortfield, SolrQuery.ORDER.desc);
- }
- }
- //设置高亮
- if (null != hightlight) {
- query.setHighlight(true); // 开启高亮组件
- query.addHighlightField("title");// 高亮字段
- query.setHighlightSimplePre("<fontcolor="red">");// 标记
- query.setHighlightSimplePost("</font>");
- query.setHighlightSnippets(1);//结果分片数,默认为1
- query.setHighlightFragsize(1000);//每个分片的最大长度,默认为100
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- QueryResponse rsp = null;
- try {
- rsp = solr.query(query);
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- //返回查询结果
- return rsp;
- }
复制代码补充一下范围查询的格式:[star t TOend],start与end是相应数据格式的值的字符串形式,“TO” 一定要保持大写!
6、 读取查询结果 DocList读取返回结果: SolrDocumentList solrList = rsp.getResults();
Beans读取返回结果: List<Item> tmpLists =rsp.getBeans(Item.class);
读取高亮显示结果: - rsp = Search(field, key, 0, 10, sortfield, flag, true);
- if(null == rsp){
- return;
- }
- Map<String, Map<String,List<String>>>hightlight = rsp.getHighlighting();
- //Item即为上面定义的bean类
- List<Item> tmpLists =rsp.getBeans(Item.class);
- for (int i = 0; i < tmpLists.size(); i++){
- //hightlight的键为Item的id,值唯一,我们设置的高亮字段为title
- String hlString =hightlight.get(tmpLists.get(i).getId()).get("title").toString();
- if (null != hlString) {
- System.out.println(hlString);
- }
- }
复制代码 7、 Facet的一个应用:自动补全- //prefix为前缀,min为最大返回结果数
- public static String[] autoComplete(String prefix, int min){
- String words[] = null;
- StringBuffer sb = new StringBuffer("");
- SolrQuery query = new SolrQuery("*.*");
- QueryResponse rsp= new QueryResponse();
- //Facet为solr中的层次分类查询
- try {
- query.setFacet(true);
- query.setQuery("*:*");
- query.setFacetPrefix(prefix);
- query.addFacetField("title");
- rsp = solr.query(query);
- } catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- return null;
- }
- if(null != rsp){
- FacetField ff = rsp.getFacetField("title");
- List<Count> countList =ff.getValues();
- if(null == countList){
- return null;
- }
- for(int i=0; i<countList.size(); i++){
- String tmp[] = countList.get(i).toString().split(" ");
- //排除单个字
- if(tmp[0].length()< 2){
- continue;
- }
- sb.append(tmp[0] + " ");
- min--;
- if(min == 0){
- break;
- }
- }
- words = sb.toString().split(" ");
- }else{
- return null;
- }
- return words;
- }
复制代码 二、总结
在使用solr之前,笔者曾经用lucene与MMAnalyer自行搭建了一个索引搜索体系,由于要组合运用lucene的API,且lucene索引支持的数据格式有限,所以效率要大大低于solr,查询尚可,建立索引的速度差距尤为明显,Solr无疑是建立站内搜索等任务的首选。本人对于Solr的研究也是刚刚起步,希望能和更多的朋友交流、进步。
三、参考资料
1、 ITeye中Solr相关的网页
2、 累积:技海拾贝――Apache_Solr_初级教程.pdf
3、 solr_使用安装介绍.doc
4、 solr_DOC_CN.pdf
from:http://go.cxweb.com.cn/mkqzf
|