利用Solr搭建你的搜索引擎

1, 下载solr 3.0/4.0,本文以3.0为例(参考附件的说明)

2, 创建一个抽象的SolrEntity,在solr的schema文件中,定义这几个字段
public abstract class SolrEntity implements Serializable {

    @Field("id")
    protected String solrjId;

    @Field("entity_author")
    protected String entityAuthor;

    @Field("entity_content")
    protected String entityContent;

    @Field("entity_timestamp")
    protected String entityTimeStamp;

    //All the Pojo must override this method to generate the index
    public abstract void generateSolrIndex();

    public static SolrEntity generateSolrEntity(SolrDocument document) {
        SolrEntity entity = new SolrEntity() {
            @Override
            public void generateSolrIndex() {

            }
        };
        entity.setSolrjId(String.valueOf(document.getFieldValue("id")));
        entity.setEntityAuthor(String.valueOf(document.getFieldValue("entity_author")));
        entity.setEntityContent(String.valueOf(document.getFieldValue("entity_content")));
        entity.setEntityTimeStamp(String.valueOf(document.getFieldValue("entity_timestamp")));

        return entity;
    }

    public void highlight(String keywords) {
        //TODO:here we can make the search string high light
    }

    public String getSolrjId() {
        return solrjId;
    }

    public void setSolrjId(String solrjId) {
        this.solrjId = solrjId;
    }

    public String getEntityContent() {
        return entityContent;
    }

    public void setEntityContent(String entityContent) {
        this.entityContent = entityContent;
    }

    public String getEntityAuthor() {
        return entityAuthor;
    }

    public void setEntityAuthor(String entityAuthor) {
        this.entityAuthor = entityAuthor;
    }

    public String getEntityTimeStamp() {
        return entityTimeStamp;
    }

    public void setEntityTimeStamp(String entityTimeStamp) {
        this.entityTimeStamp = entityTimeStamp;
    }
}

3, 集成这个SolrEntity的需要实现下面的这个方法
public void generateSolrIndex() {
        this.solrjId = this.getClass().getSimpleName() + ":" + id;
        this.entityAuthor = getCreatorName();
        this.entityContent = getContext();
        this.entityTimeStamp = DateUtil.formatDateToString(getCreateTime());
    }

4, 创建SolrService和SolrServiceImpl
public interface SolrService {
    //最好通过事件来通知更新索引
    void index(SolrEntity entity);

    void delete(SolrEntity entity);

    int queryForNumber(String searchCondition) throws Exception;

    List<SolrEntity> queryForResult(String searchCondition, int start) throws Exception;
}

ublic class SolrServiceImpl implements SolrService {

    public void index(SolrEntity entity) {
        try {
            SolrServerService solrServerService = new SolrServerService();
            CommonsHttpSolrServer solrServer = solrServerService.getServer();

            entity.generateSolrIndex();
            solrServer.addBean(entity);
            solrServer.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void delete(SolrEntity entity) {
        try {
            SolrServerService solrServerService = new SolrServerService();
            CommonsHttpSolrServer solrServer = solrServerService.getServer();

            entity.generateSolrIndex();
            solrServer.deleteByQuery("id:" + entity.getSolrjId());
            solrServer.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public int queryForNumber(String searchCondition) throws Exception {
        SolrServerService solrServerService = new SolrServerService();
        CommonsHttpSolrServer solrServer = solrServerService.getServer();

        SolrQuery query = new SolrQuery();
        query.setFields("id");
        query.setRows(10000);
        query.setQuery(searchCondition);

        QueryResponse response = solrServer.query(query);
        return response.getResults().size();
    }

    public List<SolrEntity> queryForResult(String searchCondition, int start) throws Exception {
        List<SolrEntity> entities = new ArrayList<SolrEntity>();
        SolrServerService solrServerService = new SolrServerService();
        CommonsHttpSolrServer solrServer = solrServerService.getServer();

        SolrQuery query = new SolrQuery();
        query.setRows(PagingUtil.DEFAULT_OVERVIEW_MAX_ITEMS);
        query.setStart(start);
        query.setQuery(searchCondition);

        QueryResponse response = solrServer.query(query);
        SolrDocumentList solrDocumentList = response.getResults();
        for (SolrDocument document : solrDocumentList.subList(0, solrDocumentList.size())) {
            SolrEntity entity = SolrEntity.generateSolrEntity(document);
            entities.add(entity);
        }

        return entities;
//这个就是你得到的结果
    }
}

5, 上面用到的SolrServerService可以通过很多种方式来获取(bean factory, pojo)
public class SolrServerService {

    private static CommonsHttpSolrServer server;

public CommonsHttpSolrServer getServer() {
        if (server == null) {
            try {
                InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("Solr.properties");
                Properties p = new Properties();
                try {
                    p.load(inputStream);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                String serverUrl = p.getProperty("solr.serverUrl");
                String connectionTimeout = p.getProperty("solr.connectionTimeout");
                String defaultMaxConnectionsPerHost = p.getProperty("solr.connectionTimeout");
                String maxTotalConnections = p.getProperty("solr.maxTotalConnections");
                String followRedirects = p.getProperty("solr.followRedirects");
                String allowCompression = p.getProperty("solr.allowCompression");
                String maxRetries = p.getProperty("solr.maxRetries");

                server = new CommonsHttpSolrServer(serverUrl);
                server.setConnectionTimeout(Integer.valueOf(connectionTimeout));
                server.setDefaultMaxConnectionsPerHost(Integer.valueOf(defaultMaxConnectionsPerHost));
                server.setMaxTotalConnections(Integer.valueOf(maxTotalConnections));
                server.setFollowRedirects(Boolean.valueOf(followRedirects));
                server.setAllowCompression(Boolean.valueOf(allowCompression));
                server.setMaxRetries(Integer.valueOf(maxRetries));
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException("solr init error");
            }
        }
        return server;
    }
}

猜你喜欢

转载自kunkun39.iteye.com/blog/1765564