solr全文检索(多字段搜索)

1.   Solr的目录介绍

dist: solr部署的war包,solrJ客户端
example\solr: 一个标准的solr的索引库
example\lib\ext: solr服务和solrJ客户端依赖的jar包


2.   Solr的环境搭建

a: 准备一台干净的tomcat,并更改其端口,避免与我们的项目冲突
b: 解压solr的war包,将解压后的solr放入tomcat的webapps下,并改名为solr(不是必须的)
c: 将example\lib\ext的日志jar拷贝到solr项目的lib包里面
d: 将example\solr拷贝出来,改名为solrHome(不是必须的,大家都习惯叫这个名字)
e: 在solr项目中的web.xml,配置索引库的位置

f: 重启tomcat,访问http://localhost:8888/solr


3.   配置中文分析器

第一步:把IKAnalyzer2012FF_u1.jar添加到solr/WEB-INF/lib目录下。

第二步:复制IKAnalyzer的配置文件和自定义词典和停用词词典到solr的solr/WEB-INF/classes目录下

复制IK分词器配置文件、自定义词典、停用词词典


粘贴到Tomcat的solr的/WEB-INF/classes目录下

第三步:在schema.xml中添加一个自定义的fieldType,使用中文分析器。

       <!-- IKAnalyzer-->

    <fieldType name="text_ik"class="solr.TextField">

            <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

    </fieldType>

第四步:在schema.xml中添加field,指定field的type属性为text_ik

<!--IKAnalyzerField-->

<fieldname="content_ik" type="text_ik" indexed="true"stored="true" />

第五步:重启tomcat


4.   Schema.xml中配置业务域

<!--例如:product-->

<fieldname="product_name" type="text_ik" indexed="true"   stored="true"/>

<fieldname="product_price" type="float" indexed="true"  stored="true"/>

<fieldname="product_description" type="text_ik"indexed="true" stored="false" />

<fieldname="product_picture" type="string"indexed="false" stored="true" />

<fieldname="product_catalog_name" type="string"indexed="true" stored="true" />

 

<field name="product_keywords"type="text_ik" indexed="true" stored="false"multiValued="true"/>

<!--  拷贝域  将product_name、product_description的分词拷贝到product_keywords中  搜索product_keywords会搜索product_name、product_description-->

<copyFieldsource="product_name" dest="product_keywords"/>

<copyFieldsource="product_description" dest="product_keywords"/>


5.   dataimportHandler插件

使用dataimport插件批量导入数据。

第一步:把dataimport插件依赖的jar包添加到solrcore(collection1\lib)中, 还 需要 mysql 的数据库驱动。orcal数据驱动(ojdbc6)


第二步:配置solrconfig.mxl文件,添加一个requestHandler。

 <requestHandler name="/dataimport"

class="org.apache.solr.handler.dataimport.DataImportHandler">

    <lst name="defaults">

      <str name="config">data-config.xml</str>

     </lst>

  </requestHandler> 

第三步:创建一个data-config.xml,保存到collection1\conf\目录下

<?xml version="1.0" encoding="UTF-8" ?> 

<dataConfig>  

         <dataSource type="JdbcDataSource"  

                              driver="com.mysql.jdbc.Driver"  

                              url="jdbc:mysql://localhost:3306/lucene"  

                              user="root"  

                              password="root"/>  

         <document>  

                   <entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products ">

                             <field column="pid" name="id"/>

                             <field column="name" name="product_name"/>

                             <field column="catalog_name" name="product_catalog_name"/>

                             <field column="price" name="product_price"/>

                             <field column="description" name="product_description"/>

                             <field column="picture" name="product_picture"/>

                   </entity>  

         </document>  

</dataConfig>

第四步:重启tomcat




//复杂查询索引

@Test

publicvoid queryIndex2() throws Exception {

      //创建连接

      SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");

      //创建一个query对象

      SolrQuery query = new SolrQuery();

      //设置查询条件

      query.setQuery("钻石");

      //过滤条件

      query.setFilterQueries("product_catalog_name:幽默杂货");

      //排序条件

      query.setSort("product_price", ORDER.asc);

      //分页处理

      query.setStart(0);

      query.setRows(10);

      //结果中域的列表

           query.setFields("id","product_name","product_price","product_catalog_name","product_picture");

      //设置默认搜索域

      query.set("df", "product_keywords");

      //高亮显示

      query.setHighlight(true);

      //高亮显示的域

      query.addHighlightField("product_name");

      //高亮显示的前缀

      query.setHighlightSimplePre("<em>");

      //高亮显示的后缀

      query.setHighlightSimplePost("</em>");

      //执行查询

      QueryResponse queryResponse = solrServer.query(query);

      //取查询结果

      SolrDocumentList solrDocumentList = queryResponse.getResults();

      //共查询到商品数量

      System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound());

      //遍历查询的结果

      for (SolrDocument solrDocument : solrDocumentList) {

           System.out.println(solrDocument.get("id"));

           //取高亮显示

           String productName = "";

           Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();

           List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");

           //判断是否有高亮内容

           if (null != list) {

                 productName = list.get(0);

           } else {

                 productName = (String) solrDocument.get("product_name");

           }

                

           System.out.println(productName);

           System.out.println(solrDocument.get("product_price"));

           System.out.println(solrDocument.get("product_catalog_name"));

           System.out.println(solrDocument.get("product_picture"));

                

      }

}



设置拷贝域

<!-- 故障名称-->
	<field name="fault_name" type="text_ik" indexed="true" stored="true"/>
	<!-- 故障原因-->
	<field name="fault_reason" type="text_ik" indexed="true" stored="true"/>
	<!-- 排故建议-->
	<field name="fault_solve" type="text_ik" indexed="true" stored="true"/>
	<!-- 综合查询-->
	<field name="fault_all" type="text_ik" indexed="true" stored="true" multiValued="true"/>
	
	<!-- 将fault_name的分词复制到fault_reason、fault_solve中 按照fault_name检索时会检索这两个字段 -->
	<defaultSearchField>fault_all</defaultSearchField>
	<solrQueryParser defaultOperator="AND"/>
	<copyField source="fault_name" dest="fault_all"/>
	<copyField source="fault_reason" dest="fault_all"/>
	<copyField source="fault_solve" dest="fault_all"/>

查询语句  多字段高亮显示  多域名查询

//创建查询语句
		    	SolrQuery query = new SolrQuery();
		    	
		    	//设置关键字
		    	if(keyword == null || keyword.equals("")){
		    		keyword = "*:*";
		    	}
		    	
		    	
		    	query.setQuery(keyword);
		    	//设置查询域 
		    	query.set("df", "fault_all");
		    	
		    	//设置高亮展示
		    	query.setHighlight(true);
		    	//添加高亮展示域名
		    	query.addHighlightField("fault_name");
		    	query.addHighlightField("fault_reason");
		    	query.addHighlightField("fault_solve");
		    	//设置前缀
		    	query.setHighlightSimplePre("<font style=\"color:red\">");
		    	//设置后缀
		    	query.setHighlightSimplePost("</font>");
		    	
		    	//获得返回值
				QueryResponse response = solrServer.query(query);
				//获取结果集
				SolrDocumentList results = response.getResults();
				//获得高亮显示结果集
				Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
				
				List<FaultModel> list = new ArrayList<>();
				
				for (SolrDocument fault : results) {
					FaultModel faultModel1 = new FaultModel();
					faultModel1.setId(String.valueOf(fault.get("id")));
					faultModel1.setFaultName(String.valueOf(fault.get("fault_name")));
					faultModel1.setFaultReason(String.valueOf(fault.get("fault_reason")));
					faultModel1.setSolveSuggestion(String.valueOf(fault.get("fault_solve")));
					
					List<String> nameList = highlighting.get(fault.get("id")).get("fault_name");
					if( nameList != null && nameList.size() > 0 ){
						//如果有高亮显示  显示名称
						faultModel1.setFaultName(nameList.get(0));
					}else{
						//如果没有正常显示
						faultModel1.setFaultName(String.valueOf(fault.get("fault_name")));
					}
					
					List<String> reasonList = highlighting.get(fault.get("id")).get("fault_reason");
					if( reasonList != null && reasonList.size() > 0 ){
						//如果有高亮显示  显示名称
						faultModel1.setFaultReason(reasonList.get(0));
					}else{
						//如果没有正常显示
						faultModel1.setFaultReason(String.valueOf(fault.get("fault_reason")));
					}
					
					List<String> solveList = highlighting.get(fault.get("id")).get("fault_solve");
					if( solveList != null && solveList.size() > 0 ){
						//如果有高亮显示  显示名称
						faultModel1.setSolveSuggestion(solveList.get(0));
					}else{
						//如果没有正常显示
						faultModel1.setSolveSuggestion(String.valueOf(fault.get("fault_solve")));
					}
					
					list.add(faultModel1);
					
				}
				
				return list;





猜你喜欢

转载自blog.csdn.net/yapengliu/article/details/79444856