一、solr的搭建
以solr7.1.0版本为例,系统为CentOS 6.8
solr7.1.0 下载地址 http://archive.apache.org/dist/lucene/solr/7.1.0/solr-7.1.0.tgz
或者直接在linux输入
wget http://archive.apache.org/dist/lucene/solr/7.1.0/solr-7.1.0.tgz
解压完成后
因为solr7自带jetty服务器,不需要额外部署tomcat,非常的方便
进入到bin目录下开启solr
打开浏览器输入http://localhost:8983/solr,默认端口号为8983,就可打开solr管理界面了
接下来就是添加核心add core,
在这步骤之前需要进入该目录下,创建核心的名称的文件夹,例如csdn。
并把configsets/_default/conf文件拷贝到csdn目录下
然后回到add core页面输入csdn就可以添加成功了。
添加完毕后,需配置中文分词,这里使用的是IK分词器,进入csdn下的conf文件找到并编辑managed-schema,添加以下,保存并退出!wq
<fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
</fieldType>
以上就是solr的搭建了,下面介绍下solr的简易使用。
二、solr的使用
主要使用solrj来操作solr,pom依赖如下
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.3</version>
</dependency>
先来个简单的实体类
public class SolrBlog {
private Integer id;
private String title;
private String describe;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
}
接下来也需配置managed-schema添加以下代码(与前面的中文分词器关联),与实体类对应,保存并退出wq!
<field name="title" type="text_ik" />
<field name="describe" type="text_ik" />
<field name="searchText" type="text_ik" multiValued="true"/>
<copyField source="title" dest="searchText"/>
<copyField source="describe" dest="searchText"/>
有一个name=”searchText”的标签field,是用来把title和describe联系在一起,这样查询的时候,就会自动查询这两个字段,比较方便。
SolrServiceImpl类
@Service
public class SolrServiceImpl implements SolrService {
private final SolrDao solrDao;
@Autowired
public SolrServiceImpl(SolrDao solrDao) {
this.solrDao = solrDao;
}
@Override
public void importAllBlogSolr(List<SolrBlog> solrBlogList) {
try {
for(SolrBlog solrBlog : solrBlogList) {
SolrInputDocument document = new SolrInputDocument();
document.addField("id", solrBlog.getId());
document.addField("title", solrBlog.getTitle());
document.addField("describe", solrBlog.getDescribe());
solrDao.addAllBlogSolr(document);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public List<SolrBlog> searchBySolr(PageQuery pageQuery) {
BeanValidator.check(pageQuery);
SolrQuery solrQuery = new SolrQuery();
//设置查找区域和查找内容
solrQuery.setQuery("searchText:" + pageQuery.getQueryString());
solrQuery.setStart(pageQuery.getPageNo() - 1);
solrQuery.setRows(pageQuery.getPageSize());
//设置默认搜索域
//solrQuery.set("df", "searchText");
//设置高亮显示
solrQuery.setHighlight(true);
solrQuery.addHighlightField("title");
solrQuery.setHighlightSimplePre("<font color='red'>");
solrQuery.setHighlightSimplePost("</font>");
//执行查询
List<SolrBlog> solrBlogList = null;
try {
solrBlogList = solrDao.searchBySolr(solrQuery);
} catch (Exception e) {
e.printStackTrace();
}
return solrBlogList;
}
@Override
public void deleteSolrByBlogId(long id) {
try {
solrDao.deleteBlogSolrById(id);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void addBlogSolr(SolrBlog solrBlog) {
try {
SolrInputDocument document = new SolrInputDocument();
document.addField("id", solrBlog.getId());
document.addField("title", solrBlog.getTitle());
document.addField("describe", solrBlog.getDescribe());
solrDao.addBlogSolr(document);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void updateBlogSolr(SolrBlog solrBlog) {
deleteSolrByBlogId(solrBlog.getId());
addBlogSolr(solrBlog);
}
@Override
public void deleteAllBlogSolr() {
try {
solrDao.deleteAllBlogSolr();
} catch (Exception e) {
e.printStackTrace();
}
}
}
SolrDaoImpl类
public class SolrDaoImpl implements SolrDao {
@Autowired
private SolrServer solrServer;
@Override
public void addAllBlogSolr(SolrInputDocument document) throws IOException, SolrServerException {
solrServer.add(document);
solrServer.commit();
}
@Override
public List<SolrBlog> searchBySolr(SolrQuery solrQuery) throws SolrServerException {
//根据条件查询索引库
QueryResponse queryResponse = solrServer.query(solrQuery);
SolrDocumentList solrDocumentList = queryResponse.getResults();
List<SolrBlog> solrBlogList = new ArrayList<>();
//取高亮显示
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
//取博客列表
for(SolrDocument solrDocument : solrDocumentList) {
SolrBlog solrBlog = new SolrBlog();
//取高亮显示的结果
List<String> list = highlighting.get(solrDocument.get("id")).get("title");
String title;
if(list != null && list.size() > 0) {
title = list.get(0);
} else {
title = (String) solrDocument.get("title");
}
solrBlog.setId(Integer.valueOf((String) solrDocument.get("id")));
solrBlog.setTitle(title);
solrBlog.setDescribe((String) solrDocument.get("describe"));
solrBlogList.add(solrBlog);
}
return solrBlogList;
}
@Override
public void deleteBlogSolrById(long id) throws IOException, SolrServerException {
solrServer.deleteByQuery("id:" + String.valueOf(id));
solrServer.commit();
}
@Override
public void addBlogSolr(SolrInputDocument document) throws IOException, SolrServerException {
solrServer.add(document);
solrServer.commit();
}
@Override
public void deleteAllBlogSolr() throws IOException, SolrServerException {
solrServer.deleteByQuery("*:*");
solrServer.commit();
}
}
代码都比较简单,就不做太多介绍了。以上就是solr的搭建和solrJ简易使用示例。