sanhutrees 发表于 2016-12-16 07:11:38

利用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;
    }
}
页: [1]
查看完整版本: 利用Solr搭建你的搜索引擎