今天来研究了一下solr,以及怎么集成ik分词器,把研究的过程记录下来,整个过程是在windows 7系统中完成的。
参考:http://blog.csdn.net/frankcheng5143/article/details/71159936
http://blog.csdn.net/xiaokang123456kao/article/details/72846591
https://www.cnblogs.com/zhuxiaojie/p/5764680.html
下载solr7.2.1、ik分词器
solr7.2.1需要java8环境,且需要在环境变量中添加 JAVA_HOME变量,指向jdk1.8的目录,如下图:
把下载的solr解压到出来,并通过cmd窗口进入到solr-7.2.1\bin目录,在地址栏中输入cmd,打开命令窗口
输入以下命令运行solr
solr.cmd start
在浏览器中输入http://localhost:8983,如果能打开solr控制台界面,说明solr启动成功。
我们创建一个articles的集合,输入如下命令:
solr.cmd create -c articles
之后就可以在控制台中看到创建的articles了
1、把下载的ik分词器解压出来,并把下面两个jar包复制到:solr-7.2.1\server\solr-webapp\webapp\WEB-INF\lib里
2、在solr-7.2.1\server\solr-webapp\webapp\WEB-INF目录下新建一个classes目录,把下面三个文件复制进去
3、进入solr-7.2.1\server\solr\articles\conf目录,用记事本或其他文本编辑器打开managed-schema文件,在截图中的位置添加如下代码:
4、重新启动solr
关闭:solr.cmd stop -all
启动:solr.cmd start
在控制台中选中articles,并打开Analysis菜单,输入截图中的文字,点击按钮,发现可以分词成功,说明ik分词器安装成功。
1、在managed-schema文件中追加以下内容,field 中的name字段要跟java实体对应
2、pom文件添加如下依赖
org.apache.solr
solr-solrj
5.5.2
junit
junit
4.11
org.slf4j
slf4j-log4j12
1.7.7
commons-logging
commons-logging
1.1.3
org.apache.commons
commons-lang3
3.3.2
com.fasterxml.jackson.core
jackson-databind
2.4.2
3、添加SolrDataDTO.java文件
package solrtest01;
import java.io.Serializable;
import org.apache.solr.client.solrj.beans.Field;
public class SolrDataDTO implements Serializable {
private static final long serialVersionUID = 1L;
@Field("id")
private Integer id;
@Field("title")
private String title;
@Field("labels")
private String labels;
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 getLabels() {
return labels;
}
public void setLabels(String labels) {
this.labels = labels;
}
}
4、添加SolrUtils 操作solr
package solrtest01;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
public class SolrUtils {
private String serverUrl = "http://localhost:8983/solr/articles";
public void Add(SolrDataDTO dto) throws IOException, SolrServerException{
HttpSolrClient client=new HttpSolrClient(serverUrl);
SolrInputDocument document=new SolrInputDocument();
client.addBean(dto);
client.commit();
}
public List search(String keywords,Integer page, Integer rows ) throws SolrServerException, IOException{
HttpSolrClient client=new HttpSolrClient(serverUrl);
SolrQuery solrQuery = new SolrQuery(); //构造搜索条件
solrQuery.set("q","title:" + keywords); //搜索关键词
// 设置分页 start=0就是从0开始,,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了。
solrQuery.setStart((Math.max(page, 1) - 1) * rows);
solrQuery.setRows(rows);
//执行搜索
QueryResponse queryResponse = client.query(solrQuery);
//搜索结果
SolrDocumentList results = queryResponse.getResults();
//总数量
long numFound = results.getNumFound();
List dataDTOs=new ArrayList();
for (SolrDocument solrDocument : results) {
SolrDataDTO dto=new SolrDataDTO();
dto.setId(Integer.valueOf(solrDocument.get("id").toString()));
dto.setLabels(solrDocument.get("labels").toString());
dto.setTitle(solrDocument.get("title").toString());
dataDTOs.add(dto);
}
//List dataDTOs=queryResponse.getBeans(SolrDataDTO.class);
System.out.println("查询出来的总量为:"+numFound);
return dataDTOs;
}
public void del() throws SolrServerException, IOException
{
HttpSolrClient client=new HttpSolrClient(serverUrl);
Listids=new ArrayList();
ids.add("1");
ids.add("2");
ids.add("3");
ids.add("4");
ids.add("5");
client.deleteById(ids);
client.commit();
}
}
SolrUtils solrUtils=new SolrUtils();
@Test
public void add() throws IOException, SolrServerException
{
SolrDataDTO dto=new SolrDataDTO();
dto.setId(4);
dto.setTitle("标题4");
dto.setLabels("动物,羊,马");
solrUtils.Add(dto);
dto.setId(5);
dto.setTitle("标题5");
dto.setLabels("公交,地铁,飞机");
solrUtils.Add(dto);
}
7、我们在labels字段上使用了ik分词器,效果如下