设为首页 收藏本站
查看: 575|回复: 0

[经验分享] 利用Solr搭建你的搜索引擎

[复制链接]

尚未签到

发表于 2016-12-16 07:11:38 | 显示全部楼层 |阅读模式
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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-314819-1-1.html 上篇帖子: solr学习三(测试类,含普通与ExtractingRequestHandler测试) 下篇帖子: Solr集群Replication配置与实践
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表