欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

solr配置

程序员文章站 2022-07-09 16:44:56
...

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,如图。
solr配置
改如图标识的路径,其他两项不用动。

7.solrhome\collection1\conf文件夹的data-config.xml。修改data-config.xml,如图。
solr配置
改如图标识的数据库参数,根据需求,改sql语句以及字段。

8.solrhome\collection1\conf文件夹的schema.xml。修改schema.xml,如图。
solr配置
把要查询的字段按要求都写上。
把uniqueKey也配置上。
solr配置
9.启动tomcat,访问solr。
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目录下
solr配置
2.在solr/WEB-INF下新建一个名为classes的文件夹,将IKAnalyzer的配置文件,自定义词典和停用词词典放到classes下面
solr配置
其中,自定义词典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看数据导入情况。
solr配置
如图显示已经导入成功。
solr配置
11…如图选择Query,然后点击Execute Query,就可以查询solr中的数据了。solr配置
查询结果如图。
solr配置
12.在项目application.yml文件中配置solr。
solr配置
13.运行项目,检测solr的搜索功能。
solr配置
solr功能检测成功!

14.额外说一下,
solr中apache-tomcat-8.0.43\webapps\solr\WEB-INF\classes中的ext.dic文件中的文字,
当时是把数据中对应的表中的name字段的所有字都贴上去了。
solr配置
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