利用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;
}
}
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;
}
}
上一篇: solr4.3之拼写检查SpellChecker功能
下一篇: solr如果为项目提供易用接口