使用solr完成搜索功能

环境:linux系统
solr版本:solr-4.10.3.tar.gz
其他插件: IK中文分词器: IK Analyzer 2012FF_hf1

1、解压solr-4.10.3.tar.gz

2、ll bin

3、在/usr/local下,mkdir solr

4、mv tomcat /solr/tomcat (将tomcat移动到solr目录下)

5、cp /root/solr-4.10.3/dist/solr-4.10.3.war tomcat/webapps/solr.war (将solr的war包拷贝到tomcat/webapps)

6、cd …
bin/startup.sh (启动tomcat解压war包)

7、tail -f logs/catalina.out (查看服务器启动状态)

8、cd webapps
cd solr
cd WEB-INF
cd ~
cd solr-4.10.3
cd example
cd lib
cd ext
cp *.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib
cd /root/solr-4.10.3/example
cp -r solr /usr/local/solr/solrhome
cd /usr/local/tomcat/webapps/solr/WEB-INF
vi web.xml
做如下修改,将注释打开,将value地方改成solrhome的目录

solr/home
/usr/local/solr/solrhome/
java.lang.String

cd ../../../
bin/startup.sh
tail -f logs/catalina.out

启动之后可以通过192.168.25.130:8080/solr 可以访问solr了

导入ik分词器:
solr是不支持中文分词的,需要导入ik中文分词器

将ik分词器的文件夹拷贝到linux里
cp IKAnalyzer2012FF_u1.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
在WEB-INF下 mkdir classes
cd classes
pwd
拷贝路径
进到IK目录里
cp ext_stopword.dic IKAnalyzer.cfg.xml mydict.dic /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes
cd solrhome
cd collection1
cd conf
vi schema.xml

设置业务域

 <fieldType name="text_ik" class="solr.TextField">
        <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
   </fieldType>
   <!--自定义业务域-->
   <field name="item_title" type="text_ik" indexed="true" stored="true"/>
   <field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
   <field name="item_price" type="long" indexed="true" stored="true"/>
   <field name="item_image" type="string" indexed="false" stored="true"/>
   <field name="item_category_name" type="text_ik" indexed="true" stored="true"/>
   <field name="item_desc" type="text_ik" indexed="true" stored="true"/>
   
   <!--总的业务域:搜索一个关键字的时候只要是出现在标题或卖点或分类或描述都查询它-->
  <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
   <copyField source="item_title" dest="item_keywords"/>
   <copyField source="item_sell_point" dest="item_keywords"/>
   <copyField source="item_category_name" dest="item_keywords"/>
   <copyField source="item_desc" dest="item_keywords"/>

保存退出
启动tomcat
浏览器输入地址,可以进行相关测试
我这里是http://192.168.25.130:8080/solr

eclipse中测试:

加入依赖solr:

	<dependency>
			<groupId>org.apache.solr</groupId>
			<artifactId>solr-solrj</artifactId>
			<version>4.10.3</version>
	</dependency>

需要通过spring注入一个SolrServer

<!-- solrService -->
	<bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
		<constructor-arg name="baseURL" value="http://192.168.25.130:8080/solr/collection1"></constructor-arg>
	</bean>
	@Autowired
	private SolrServer solrServer;
	
	public JDResult getAllItems() {
			try {
			List<SearchResult> list = searchMapper.getAllItems();
			//添加到索引库中
			for(SearchResult item:list){
				SolrInputDocument doc=new SolrInputDocument();
				doc.setField("id", item.getId());
				doc.setField("item_title", item.getTitle());
				doc.setField("item_sell_point", item.getSellPoint());
				doc.setField("item_price", item.getPrice());
				doc.setField("item_image", item.getImage());
				doc.setField("item_category_name", item.getCategoryName());
				doc.setField("item_desc", item.getDescription());
				solrServer.add(doc);
			}
			//提交事务
			solrServer.commit();
			return JDResult.ok();
		} catch (Exception e) {
			e.printStackTrace();
			return JDResult.bind(400, "导入失败");
		}
	}

导出查询结果:

public Search getSearchResult(String queryString, Integer pageNow, Integer pageSize) throws Exception {
		Search search=new Search();
		//创建solrQuery对象
		SolrQuery query=new SolrQuery();
		//设置查询条件
		query.setQuery(queryString);
		//分页
		if(pageNow==null||pageNow<1){
			pageNow=1;
		}
		if(pageSize==null){
			pageSize=8;
		}
		query.setStart((pageNow-1)*pageSize);
		query.setRows(pageSize);
		//设置默认域
		query.set("df", "item_keywords");
		//设置高亮
		query.setHighlight(true);
		//设置高亮显示的域
		query.addHighlightField("item_title");
		//设置前缀
		query.setHighlightSimplePre("<span style='color:red;'>");
		//设置后缀
		query.setHighlightSimplePost("</span>");
		//执行查询,得到response对象
		QueryResponse response = solrServer.query(query);
		//获取到集合
		SolrDocumentList results = response.getResults();
		//获取总信息条数
		long numFound = results.getNumFound();
		//封装到search中
		search.setCount(numFound);
		//计算总页数
		long totalPage=numFound/pageSize;
		if(numFound%pageSize!=0){
			totalPage++;
		}
		search.setTotalPages(totalPage);
		//创建SearchResult的集合
		List<SearchResult> list=new ArrayList<SearchResult>();
		for(SolrDocument solrDocument:results){
			SearchResult searchResult=new SearchResult();
			//获取到高亮
			Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
			List<String> list2 = highlighting.get(solrDocument.get("id")).get("item_title");
			//考虑到高亮不在title中
			String title="";
			if(list2!=null&&list2.size()>0){
				title=list2.get(0);
			}else{
				title=(String)solrDocument.get("item_title");
			}
			searchResult.setTitle(title);
			searchResult.setId((String)solrDocument.get("id"));
			searchResult.setSellPoint((String)solrDocument.get("item_sell_point"));
			searchResult.setPrice(solrDocument.get("item_price")+"");
			//如果上传了多张图片,那么传到solr查询后,默认展示第一张图片
			String image=(String)solrDocument.get("item_image");
			if(StringUtils.isNotBlank(image)){
				//将图片分割成数组
				image= image.split(",")[0];
			}else{
				//如果为空,放一张默认的图片的地址
				image="http://192.168.25.133/group1/M00/00/00/wKgZhVqwrM-AfymiAADXbj4VXok563.jpg";
			}
			searchResult.setImage(image);
			//添加到集合
			list.add(searchResult);
		}
		search.setItemList(list);
		return search;
	}

导出成功

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42982636/article/details/84785922