欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用Solr搭建你的搜索引擎

程序员文章站 2022-04-04 14:13:57
...
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;
    }
}