JAVA的solr操作實現(基本操作)

JAVA操作solr的實現其實很簡單,但是很多細節要注意,在實際的開發中,很多人喜歡自己封裝這些基礎的方法以一個全新的“面貌”出現,其實都是一回事,操作熟了自然就會想到將一些實現功能用到的方法重新封裝,這也是編程進階的表現。

SolrJ的使用

       SolrJ覆蓋了solr的全部功能,下面將自己在實際開發中所使用的程序粘貼出來並適當加以解釋,由於本人比較菜,代碼書寫不是那麼的精練,還請見諒。

 

1、  創建solrserver對象:

try {

               solr = new CommonsHttpSolrServer("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 = new ArrayList<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[i] + ":" + key[i]);

                     }

                     //設置起始位置與返回結果數

                     query.setStart(start);

                     query.setRows(count);

                     //設置排序

                     for(int i=0; i<sortfield.length; i++){

                            if (flag[i]) {

                                   query.addSortField(sortfield[i], SolrQuery.ORDER.asc);

                            } else {

                                   query.addSortField(sortfield[i], SolrQuery.ORDER.desc);

                            }

                     }

                     //設置高亮

                     if (null != hightlight) {

                            query.setHighlight(true); // 開啓高亮組件

                            query.addHighlightField("title");// 高亮字段

                            query.setHighlightSimplePre("<font color="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 TO end]startend是相應數據格式的值的字符串形式,“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的鍵爲Itemid,值唯一,我們設置的高亮字段爲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();

              //Facetsolr中的層次分類查詢

              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;

       }

轉載地址:http://blog.csdn.net/ITbasketplayer/article/details/8086160


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章