利用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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值