solr基本操作代碼示例

jopen 10年前發布 | 71K 次閱讀 Solr 搜索引擎

1、基本操作類

 import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.FacetField.Count;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;

import com.xzhe.goods.bo.Goods;
import com.xzhe.goods.dao.impl.GoodsDAO;

public class SolrSearch {
    private static String tomcat_solr = "http://localhost:8983/solr";
    private static CommonsHttpSolrServer solr = null;
    private static GoodsDAO goodsDAO = GoodsDAO.getInstance();
    private static List<Goods> goodList = new ArrayList<Goods>();

    // 初始化solr服務
    public static void initiate() {
        try {
            solr = new CommonsHttpSolrServer(tomcat_solr);
            solr.setConnectionTimeout(100);
            solr.setDefaultMaxConnectionsPerHost(100);
            solr.setMaxTotalConnections(100);
        } catch (Exception e) {
            System.out.println("請檢查tomcat服務器或端口是否開啟!");
            e.printStackTrace();
        }
    }

    // 檢測good是否有字段為空
    public static Boolean CheckGood(Goods good) {
        if (null == good.getTitle() || good.getTitle().length() == 0) {
            return false;
        } else if (null == good.getGoodsId()) {
            return false;
        } else if (null == good.getStartTime()) {
            return false;
        } else if (null == good.getDiscount()) {
            return false;
        } else if (null == good.getCurPrice()) {
            return false;
        } else if (null == good.getSiteId()) {
            return false;
        } else if (null == good.getBuyNum()) {
            return false;
        } else {
            return true;
        }
    }

    // 將數據庫中的時間轉換為solr可接受的格式
    public static String Convertime(String time) {
        time = time.replace(" ", "T");
        time = time + "00Z";
        return time;
    }

    // 添加list到索引,flag為false,在原有基礎上添加,為false,重新添加、原有索引不會被刪除
    public static void addGoods(List<Goods> list, Boolean flag) {
        if (flag) {
            try {
                solr.deleteByQuery("*:*");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();

        for (int i = 0; i < list.size(); i++) {
            Goods good = list.get(i);
            if (CheckGood(good)) {
                SolrInputDocument doc = new SolrInputDocument();
                doc.addField("goodid", good.getGoodsId());
                doc.addField("title", good.getTitle());
                doc.addField("siteid", good.getSiteId());
                doc.addField("buynum", good.getBuyNum());
                doc.addField("starttime", Convertime(good.getStartTime()
                        .toString()));
                doc.addField("discount", good.getDiscount());
                doc.addField("curprice", good.getCurPrice());
                docs.add(doc);
            }
        }

        try {
            solr.add(docs);
            solr.optimize();
            solr.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 轉換good到beans
    public static GoodsBeans ConvertGoodstoBeans(Goods good) {
        if (!CheckGood(good)) {
            return null;
        }
        GoodsBeans beans = new GoodsBeans(good.getGoodsId().toString(),
                good.getTitle(), good.getSiteId().toString(), good.getBuyNum(),
                good.getStartTime(), good.getDiscount(), good.getCurPrice());
        return beans;
    }

    // 添加beans到索引
    public static void addGoodsBeans(List<GoodsBeans> beansList) {
        try {
            solr.addBeans(beansList);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                solr.optimize();
                solr.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 刪除所有索引
    public static void DeleteAllIndex() {
        try {
            solr.deleteByQuery("*:*");
            solr.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 根據ID刪除索引
    public static void DeleteIndex(List<String> ids) {
        try {
            solr.deleteById(ids);
            solr.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 進行搜索,field、key為查詢(值或范圍均可),start為起始查詢位置,row為返回結果個數,sortfield為排序字段,flag中true升序、false降序,hightlight選擇是否高亮返回,高亮字段為title
    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 {
            if (field[0].equals("title")) {
                // query = new SolrQuery("*" + key + "*");
                query = new SolrQuery(field[0] + ":" + key[0]);
            } else {
                query = new SolrQuery(field[0] + ":" + key[0]);
            }
            for (int i = 0; i < field.length; i++) {
                if (field[i].equals("title")) {
                    // query = new SolrQuery("*" + key + "*");
                    query.addFilterQuery(field[i] + ":" + key[i]);
                } else {
                    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);
                query.setHighlightFragsize(1000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(query.toString());

        QueryResponse rsp = null;
        try {
            rsp = solr.query(query);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return rsp;
    }

    // 自動補全
    public static String[] autoComplete(String prefix, int min) {
        String words[] = null;
        StringBuffer sb = new StringBuffer("");
        SolrQuery query = new SolrQuery("*.*");
        QueryResponse rsp = new QueryResponse();
        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;
    }

    public static void main(String[] args) {
        initiate();

        // 建立索引
//       goodList = goodsDAO.findAll();
//       System.out.println("所有商品載入完成!");
//       DeleteAllIndex();
//       System.out.println("原有索引已清除!");
//       System.out.println("添加索引開始!");
//       long starttime = System.currentTimeMillis();
//       addGoods(goodList, true);
//       long endtime = System.currentTimeMillis();
//       System.out.println("共耗時" + (endtime - starttime) + "ms!");
//       System.out.println("添加索引完成!");

        // 進行查詢
        SolrDocumentList solrList = null;
        QueryResponse rsp = null;

        // rsp = Search("title", "*變形金* 藍精靈", 0, 10, "buynum", false, true);
//      String field[] = { "title", "buynum", "discount", "starttime" };
//      String key[] = { "變形金剛 哈利波特", "[90 TO 100]", "[2.0 TO 3.0]",
//              "[2011-07-18T00:00:00.000Z TO 2011-07-19T00:00:00.000Z]" };
        String field[] = {"title"};
        String key[] = {"牛奶"};
        String sortfield[] = { "buynum" };
        Boolean flag[] = { false };
        long starttime = System.currentTimeMillis();
        rsp = Search(field, key, 0, 10, sortfield, flag, true);
        long endtime = System.currentTimeMillis();
        System.out.println("共耗時" + (endtime - starttime) + "ms!");

        if (null != rsp) {
            solrList = rsp.getResults();
            for (int i = 0; i < solrList.size(); i++) {
                System.out.println(solrList.get(i).toString());
            }
            // 高亮顯示部分
            System.out.println("搜索結果共" + solrList.size() + "條!");
            System.out.println("");
            Map<String, Map<String, List<String>>> hightlight = rsp
                    .getHighlighting();
            List<GoodsBeans> tmpLists = rsp.getBeans(GoodsBeans.class);
            for (int i = 0; i < tmpLists.size(); i++) {
                String hlString = hightlight.get(tmpLists.get(i).getGoodId())
                        .get("title").toString();
                if (null != hlString) {
//                  System.out.println(hlString);
                }
            }
        }

        // 自動補全
        // String words[] = autoComplete("哈利", 10);
        // if (null != words) {
        // System.out.println(words.length);
        // for (int i = 0; i < words.length; i++) {
        // System.out.println(words[i]);
        // }
        // }
    }

}

2、bean

 
import java.util.Date;

import org.apache.solr.client.solrj.beans.Field;

public class GoodsBeans {
    @Field
    private String goodid;
    @Field
    private String title;
    @Field
    private String siteid;
    @Field
    private int buynum;
    @Field
    private Date starttime;
    @Field
    private double discount;
    @Field
    private double curprice;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getSiteid() {
        return siteid;
    }

    public void setSiteid(String siteid) {
        this.siteid = siteid;
    }

    public int getBuynum() {
        return buynum;
    }

    public void setBuynum(int buynum) {
        this.buynum = buynum;
    }

    public Date getStarttime() {
        return starttime;
    }

    public void setStarttime(Date starttime) {
        this.starttime = starttime;
    }

    public double getDiscount() {
        return discount;
    }

    public void setDiscount(double discount) {
        this.discount = discount;
    }

    public double getCurprice() {
        return curprice;
    }

    public void setCurprice(double curprice) {
        this.curprice = curprice;
    }

    public void setGoodid(String goodid) {
        this.goodid = goodid;
    }

    public String getGoodId() {
        return goodid;
    }

    public GoodsBeans(){

    }

    public GoodsBeans(String goodid, String title, String siteid, int buynum,
            Date starttime, double discount, double curprice) {
        this.goodid = goodid;
        this.title = title;
        this.siteid = siteid;
        this.buynum = buynum;
        this.starttime = starttime;
        this.discount = discount;
        this.curprice = curprice;
    }
}

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!