solr配置
solr配置
1.把\solr-4.10.3\dist\solr-4.10.3.war复制到安装的tomcat的webapps文件夹下面,本次是安装在
D:\temp\apache-tomcat-7.0.53\webapps下,并且改名为solr.war;
2.solr.war解压.使用压缩工具解压或者启动tomcat自动解压.解压之后删除solr.war;
3.把\solr-4.10.3\example\lib\ext目录下的所有的jar包添加到solr工程中WEB-INF/lib的目录中,这些都是日志的jar包,必须要有,否则运行的时候会报错;
4.solr的配置重要的有三个:solr.xml、solrConfig.xml、schema.xml
其中,solr.xml改动不多,是整个solr节点的配置,是定义关于core的管理,collection分片,solr云和http请求处理;
solrConfig.xml是关于core或collection的主要配置信息;
schema.xml用来定义索引中的文档结构,包括字段名,字段类型,字段处理方法等.
5.配置solrhome,创建solrhome文件夹,这个文件夹是用来存放所有配置文件的一个文件夹,把\solr4.10.3\example\solr文件夹复制到D:\temp路径下,为了便于理解改名为solrhome,但改名不是必须的。
在solrhome下有一个文件夹叫做collection1,这就是一个solrcore,就是一个solr的实例。
一个solrcore相当于mysql中一个数据库.Solrcore之间是相互隔离.(一个solrcore就是一个索引库)
其中:
(1).在solrcore中有一个文件夹叫做conf,包含了索引solr实例的配置信息。
(2).在conf文件夹下有一个solrconfig.xml。配置实例的相关信息。如果使用默认配置可以不用做任何修改。
6.打开apache-tomcat-8.0.43\webapps\solr\WEB-INF文件夹的web.xml。修改web.xml,如图。
改如图标识的路径,其他两项不用动。
7.solrhome\collection1\conf文件夹的data-config.xml。修改data-config.xml,如图。
改如图标识的数据库参数,根据需求,改sql语句以及字段。
8.solrhome\collection1\conf文件夹的schema.xml。修改schema.xml,如图。
把要查询的字段按要求都写上。
把uniqueKey也配置上。
9.启动tomcat,访问solr。
solr界面介绍:
(1).Dashboard仪表盘,显示了该solr实例开始启动运行的时间,版本,系统资源,jvm等信息.右边Instance的具体内容:
1.Start:查看solar的启动时间
2.Versions:包含了solr和lucene的版本
3.JVM:Runtime:java虚拟机的版本信息
Processors:CPU是4核
4.System:Physical Memory:solr所占的物理内存
Swap Space:交换空间就是虚拟内存,内存不够了,在使用硬盘作为虚拟内存,一旦使用虚拟内存,速度就慢了
(2)Logging:Solr运行日志信息
(3)Cloud,即SolrCloud,即Solr云(集群),当使用Solr Cloud模式运行时会显示此菜单
(4)Core Admin:Solr Core的管理界面。Solr Core 是Solr的一个独立运行实例单位,它可以对外提供索引和搜索服务,一个Solr工程可以运行多个SolrCore(Solr实例),一个Core对应一个索引目录。
附:
一.安装中文分词器(使用IKAnalyzer中文分析器):
1.将IKAnalyzer2012FF_u1.jar添加到solr/WEB-INF/lib目录下
2.在solr/WEB-INF下新建一个名为classes的文件夹,将IKAnalyzer的配置文件,自定义词典和停用词词典放到classes下面
其中,自定义词典ext.dic是可以告诉分词器哪些词不要拆开,停用词词典stopword.dic是告诉分词器哪些词可以忽略
3.在schema.xml中添加一个自定义的fileType,从而可以使用中文分词器
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
4.定义field,指定field的type属性为text_ik
<field name="title_ik" type="text_ik" indexed="true" stored="true" />
<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>
10.选择collection1,选择Dataimport,再点击Execute,然后可以点击Refresh Status看数据导入情况。
如图显示已经导入成功。
11…如图选择Query,然后点击Execute Query,就可以查询solr中的数据了。
查询结果如图。
12.在项目application.yml文件中配置solr。
13.运行项目,检测solr的搜索功能。
solr功能检测成功!
14.额外说一下,
solr中apache-tomcat-8.0.43\webapps\solr\WEB-INF\classes中的ext.dic文件中的文字,
当时是把数据中对应的表中的name字段的所有字都贴上去了。
15.项目中也专门写了solr的entity,controller,service,dao.
现在贴一下代码。
entity
/**
*
* TODO 字段尽量和schema.xml一直
*/
@NoArgsConstructor
@Data
@SolrDocument(solrCoreName="collection1")
public class ScheduleSolr implements Cloneable{
@Id
private String sid;
@Field
private String buildid;
@Field
private String buildingtype;
@Field
private String name;
@Field
private String aliasname;
@Field
private String scheduleversionid;
@Field
private String isbuild;
@Field
private String projectid;
@Field
private String sectionid;
@Field
private String nameabbr;
@Field
private String[] nameall;
@Field
private String description;
@Override
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
public ScheduleSolr(String sid, String buildid, String buildingtype,
String name, String aliasname, String scheduleversionid,
String isbuild, String projectid, String sectionid,
String nameabbr, String[] nameall) {
super();
this.sid = sid;
this.buildid = buildid;
this.buildingtype = buildingtype;
this.name = name;
this.aliasname = aliasname;
this.scheduleversionid = scheduleversionid;
this.isbuild = isbuild;
this.projectid = projectid;
this.sectionid = sectionid;
this.nameabbr = nameabbr;
this.nameall = nameall;
}
@Override
public String toString() {
return "ScheduleSolr [sid=" + sid + ", buildid=" + buildid
+ ", buildingtype=" + buildingtype + ", name=" + name
+ ", aliasname=" + aliasname + ", scheduleversionid="
+ scheduleversionid + ", isbuild=" + isbuild + ", projectid="
+ projectid + ", sectionid=" + sectionid + ", nameabbr="
+ nameabbr + ", nameall=" + Arrays.toString(nameall) + "]";
}
}
controller
@Controller
@RequestMapping("/search")
public class SearchController {
@Autowired
private SearchService searchService ;
@RequestMapping(value="/searchBynameAndScheduleversionid")
@ResponseBody
public String searchBynameAndScheduleversionid(String name,String scheduleversionid) throws SolrServerException{
if(StringUtils.isEmpty(name)) {
return JsonUtil.toJson(new ResultBean<String>(ResultCode.SUCCESS_CODE , ResultCode.DELETE_SUCCESS_STRING));
}
ResultBean<List<ScheduleSolr>> resultBean = this.searchService.searchBynameAndScheduleversionid(name.trim(),scheduleversionid);
return JsonUtil.toJson(resultBean);
}
}
service
public interface SearchService {
//ResultBean<List<ScheduleSolr>> searchByname(String name);
ResultBean<List<ScheduleSolr>> searchBynameAndScheduleversionid(String name,String scheduleversionid);
}
serviceimpl
@Service
public class SearchServiceImpl implements SearchService{
@Autowired
private ScheduleSolrRepository scheduleSolrRepository;
@Override
public ResultBean<List<ScheduleSolr>> searchBynameAndScheduleversionid(String name,String scheduleversionid) {
if(name.matches(".*[a-zA-z].*"))
return findNameIncludeEn(name ,scheduleversionid);
else
return findNameExcludeEn(name ,scheduleversionid);
}
private ResultBean<List<ScheduleSolr>> findNameIncludeEn(String nameall,String scheduleversionid) {
ResultBean<List<ScheduleSolr>> resultbean = new ResultBean<List<ScheduleSolr>>(0,"查询成功!");
try {
List<ScheduleSolr> projectlist = new ArrayList<ScheduleSolr>();
if(!(nameall == null || "".equals(nameall))){
projectlist = this.scheduleSolrRepository.findByScheduleversionidAndNameallLike(scheduleversionid,nameall);
}
else{
projectlist = this.scheduleSolrRepository.findByScheduleversionid(scheduleversionid);
}
resultbean.setResult(projectlist);
return resultbean;
} catch (Exception e) {
e.printStackTrace();
return new ResultBean<List<ScheduleSolr>>(-1,"查询失败!");
}
}
private ResultBean<List<ScheduleSolr>> findNameExcludeEn(String nameall,String scheduleversionid) {
ResultBean<List<ScheduleSolr>> resultbean = new ResultBean<List<ScheduleSolr>>(0,"查询成功!");
try {
Pageable p = new PageRequest(0 , 10000 );
List<ScheduleSolr> list = new ArrayList<>();
HighlightPage<List<ScheduleSolr>> listHighlightPage = null;
if(!(nameall == null || "".equals(nameall))){
listHighlightPage = scheduleSolrRepository.findByScheduleversionidAndNameallLike(scheduleversionid,nameall, p );
}
else{
listHighlightPage = scheduleSolrRepository.findByScheduleversionid(scheduleversionid, p );
}
List <HighlightEntry<List<ScheduleSolr>>> listContent = listHighlightPage.getHighlighted();
List<List<ScheduleSolr>> listp = listHighlightPage.getContent();
for(int i = 0 ; i < listContent.size() ; i ++) {
List<org.springframework.data.solr.core.query.result.HighlightEntry.Highlight> t = listContent.get(i).getHighlights();
ScheduleSolr projectLineSolr = (ScheduleSolr) listp.get(i);
if(!(nameall == null || "".equals(nameall))){
for(;;) {
projectLineSolr.setName(t.get(0).getSnipplets().get(0));
break;
}
}
list.add(projectLineSolr);
}
resultbean.setResult(list);
return resultbean;
} catch (Exception e) {
e.printStackTrace();
return new ResultBean<List<ScheduleSolr>>(-1,"查询失败!");
}
}
}
dao
public interface ScheduleSolrRepository extends SolrCrudRepository<ScheduleSolr, String> {
/*以nameabbr为开始的数据*/
List<ScheduleSolr> findByNameStartingWith(String name);
List<ScheduleSolr> findByName(String name );
List<ScheduleSolr> findByNameAndScheduleversionid(String name, String scheduleversionid );
List<ScheduleSolr> findByNameallAndScheduleversionid(String nameall, String scheduleversionid );
List<ScheduleSolr> findByScheduleversionidAndNameallLike(String scheduleversionid,String nameall);
List<ScheduleSolr> findByNameall(String nameall);
List<ScheduleSolr> findByScheduleversionid(String scheduleversionid);
List<ScheduleSolr> findByName(String name , Sort sort);
//高亮展示对应的数据
@Highlight(prefix = "<font color='blue'>", postfix = "</font>")
HighlightPage<List<ScheduleSolr>> findByName(String name, Pageable pageable );
//高亮展示对应的数据
@Highlight(prefix = "<font color='blue'>", postfix = "</font>")
HighlightPage<List<ScheduleSolr>> findByNameAndScheduleversionid(String name , String scheduleversionid, Pageable pageable );
//高亮展示对应的数据
@Highlight(prefix = "<font color='blue'>", postfix = "</font>")
HighlightPage<List<ScheduleSolr>> findByNameallAndScheduleversionid(String nameall , String scheduleversionid, Pageable pageable );
//高亮展示对应的数据
@Highlight(prefix = "<font color='blue'>", postfix = "</font>")
HighlightPage<List<ScheduleSolr>> findByScheduleversionidAndNameallLike(String scheduleversionid,String nameall,Pageable pageable );
//高亮展示对应的数据
@Highlight(prefix = "<font color='blue'>", postfix = "</font>")
HighlightPage<List<ScheduleSolr>> findByScheduleversionid(String scheduleversionid, Pageable pageable );
@Override
public <S extends ScheduleSolr> Iterable<S> save(Iterable<S> entities);
@Override
public void delete(Iterable<? extends ScheduleSolr> entities);
}
代码已贴完。
前面配置写的有点乱,大家捡有用的看。
代码是完整的。
上一篇: Solr安装