基于Lucene的Solr服务搜索引擎应用(散乱)

启动Solr服务,创建一个核“core1”

商品类

package cn.et.entity;

import org.apache.solr.client.solrj.beans.Field;

/**
 * @author Administrator
 *
 */
public class Commodity {
	//商品编号
	@Field(value="id")
	private String id;
	//商品姓名
	@Field(value="cname_ik")
	private String cname;
	//商品价格
	@Field(value="cprice_i")
	private Integer cprice;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	public Integer getCprice() {
		return cprice;
	}
	public void setCprice(Integer cprice) {
		this.cprice = cprice;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((cname == null) ? 0 : cname.hashCode());
		result = prime * result + ((cprice == null) ? 0 : cprice.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Commodity other = (Commodity) obj;
		if (cname == null) {
			if (other.cname != null)
				return false;
		} else if (!cname.equals(other.cname))
			return false;
		if (cprice == null) {
			if (other.cprice != null)
				return false;
		} else if (!cprice.equals(other.cprice))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "Commodity [id=" + id + ", cname=" + cname + ", cprice=" + cprice + "]";
	}
}


商品增删改查

package cn.et;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.FacetField.Count;
import org.apache.solr.client.solrj.response.Group;
import org.apache.solr.client.solrj.response.GroupCommand;
import org.apache.solr.client.solrj.response.GroupResponse;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.params.GroupParams;
import org.junit.Test;

import cn.et.entity.Commodity;

/**
 * Solr Java
 * @author lucheng http://blog.csdn.net/phone13144830339
 */
public class Solr {
	/**
	 * Solr服务 URL访问
	 * 当Solr服务变更时,通过setSorlUrl方法设置,通过getSorlUrl获取URL
	 */
	private String solrUrl = "http://localhost:8080/solr/core1";
	public String getSorlUrl() {
		return solrUrl;
	}
	public void setSorlUrl(String solrUrl) {
		this.solrUrl = solrUrl;
	}
	
	/**
	 * 添加或修改商品
	 * 商品名使用IK分词器进行分词
	 *	(
	 *	Solr Home中managed-schema需配置定义“*_ik”动态类型
	 *	<schema name="example" version="1.6">
	 *	  <!--...-->
	 *	  <!--定义动态类型-->
	 *	  <dynamicField name="*_ik" type="text_ik" indexed="true"  stored="true"  multiValued="true"/>
	 *	  <fieldType name="text_ik" class="solr.TextField" >  
	 *	     <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>     
	 *	     <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>   
	 *	  </fieldType>  
	 *	  <!--...-->
	 *	</schema>
	 *	)
	 * @param commodity 商品,商品对象必须具有商品编号“cid”
	 * @throws Exception
	 */
    
    //public void addCommodity(Commodity commodity) throws Exception{
	public void addCommodity(Object commodity) throws Exception{
		HttpSolrClient hsc=new HttpSolrClient(solrUrl);  
		hsc.addBean(commodity);
		hsc.commit();  
		hsc.close();
	}
	/**
	 * 根据商品编号删除商品
	 * @param cid 商品编号
	 * @throws Exception
	 */
    @Test
	public void deleteCommodity(String cid) throws Exception{
		HttpSolrClient hsc=new HttpSolrClient(solrUrl); 
		hsc.deleteById(cid);
		hsc.commit(); 
		hsc.close();
	}
	
	/**
	 * 搜索部分商品
	 * @param start 起始获取数据的位置
	 * @param rows 最大获取的条数
	 * @return 搜索到商品集
	 * @throws Exception
	 */
	 
	public List<Commodity> searchCommodity(int start,int rows) throws Exception{
		
		 HttpSolrClient hsc=new HttpSolrClient("http://localhost:8080/solr/core1");  
	        SolrQuery sq=new SolrQuery();  
	        sq.setQuery("cname_ik:*");  
	        sq.set("sort", "id asc");  
	        sq.setStart(start);  
	        sq.setRows(rows);  
	        List<Commodity> list=hsc.query(sq).getBeans(Commodity.class); 
	        return list;
	}
	
	
	public void queryGroup() throws Exception {
		HttpSolrClient hsc=new HttpSolrClient(solrUrl); 
       
        SolrQuery sq=new SolrQuery();  
   
        sq.setParam(GroupParams.GROUP,true);  
        sq.setParam(GroupParams.GROUP_FIELD, "cname_ik");  
        sq.setParam("group.ngroups", true);  
        //sq.setParam(GroupParams.GROUP_LIMIT, "5");  
        sq.setQuery("*:*");  
        sq.setRows(10);  
        QueryResponse qr=hsc.query(sq);  
        GroupResponse ff=qr.getGroupResponse();  
          
        for(GroupCommand me:ff.getValues()){  
            System.out.println(me.getName());  
             List<Group> groups=me.getValues();  
            for(Group g : groups) {
            	System.out.println(g.getResult());
            	System.out.println(g.getGroupValue());
            }
              
        } 
        
        hsc.commit();  
        hsc.close();  
  
	}
	
	/**
	 * Facet 面 用于对搜索的结果进行分类
	 */
	public void queryFacet() throws Exception {
		HttpSolrClient hsc=new HttpSolrClient(solrUrl); 
		SolrQuery sq = new SolrQuery();
		sq.setFacet(true);
		//按字段分类
		//sq.addFacetField("cname_ik");
		//范围
		sq.addFacetQuery("cprice_i:[1 TO 50]");
		sq.addFacetQuery("cprice_i:[51 TO 200]");
		sq.addFacetQuery("cprice_i:[201 TO *]");
		sq.setFacetPrefix("");
		sq.setFacetSort("cprice_i asc");
		sq.setQuery("*:*");
		QueryResponse qr = hsc.query(sq);
		
		List<FacetField> ff = qr.getFacetFields();
		System.out.println(qr.getFacetQuery());
		for(FacetField ftmp :ff) {
			System.out.println(ftmp.getName());
			List<Count> cou = ftmp.getValues();
			for(Count count : cou) {
				System.out.println(count.getName() + ":" + count.getCount());
			}
		}
		hsc.commit();
		hsc.close();
	}
	
	/**
	 * 高亮搜索部分商品
	 * @throws Exception
	 */
	static HttpSolrClient hsc=new HttpSolrClient("http://localhost:8080/solr/core1"); 
	public static List<Commodity> highlightSearchCommodity(String hs) throws Exception{
		
		
		
        SolrQuery sq=new SolrQuery();  
        sq.setQuery("cname_ik:"+hs);  
        sq.addHighlightField("cname_ik");  
        sq.setHighlight(true);  
        sq.setHighlightSimplePre("<font color=red>");  
        sq.setHighlightSimplePost("</font>");  
        QueryResponse qr=hsc.query(sq); 
        List<Commodity> list=hsc.query(sq).getBeans(Commodity.class); 
        Map<String, Map<String, List<String>>> highlighting = qr.getHighlighting();  
        Set<String> id = highlighting.keySet();
        int n = 0;
        for(String str : id) {
        	list.get(n++).setCname(str);
        }
        
        
        for(Commodity ui:list){  
        	System.out.println(ui);
        }  
        
		hsc.commit();  
		hsc.close();
		return list;
	}
}

Spring Boot控制层


package cn.et.control;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.FacetField.Count;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.et.Solr;
import cn.et.entity.Commodity;

@RestController
public class SolrControl {
	public Solr sj = new Solr();
	@RequestMapping("/search") 
	public List search(String search) throws Exception {
		if(search==null || search.trim()=="") {search="*";}
		/*Commodity commodity1 = new Commodity();
		commodity1.setId("1");
		commodity1.setCname("英雄第三个钢笔");
		commodity1.setCprice(32);
		
		
		Commodity commodity2 = new Commodity();
		commodity2.setId("2");
		commodity2.setCname("华硕东方红电话笔记本电脑");
		commodity2.setCprice(6300);
		
		sj.addCommodity(commodity1);
		sj.addCommodity(commodity2);*/
		HttpSolrClient hsc=new HttpSolrClient("http://localhost:8080/solr/core1"); 
		SolrQuery sq=new SolrQuery();  
        sq.setQuery("cname_ik:"+search);  
        sq.addHighlightField("cname_ik");  
        sq.setHighlight(true);  
        sq.setHighlightSimplePre("<font color=red>");  
        sq.setHighlightSimplePost("</font>");  
        QueryResponse qr=hsc.query(sq); 
        List<Commodity> list=hsc.query(sq).getBeans(Commodity.class); 
        Map<String, Map<String, List<String>>> highlighting = qr.getHighlighting();  
        Set<String> ids = highlighting.keySet();
      
        
        
        
        for(Commodity ui:list){  
        	ui.setCname(highlighting.get(ui.getId()).toString());
        	
        	
        }  
        
		hsc.commit();  
		hsc.close();
		return list;
	}
	
	@RequestMapping("/count") 
	public Map count(String search) throws Exception {
		if(search==null || search.trim()==""){
			search="*";
		}
		HttpSolrClient hsc=new HttpSolrClient("http://localhost:8080/solr/core1"); 
		SolrQuery sq = new SolrQuery();
		sq.setFacet(true);
		//按字段分类
		//sq.addFacetField("cname_ik");
		//范围
		sq.addFacetQuery("cprice_i:[1 TO 50]");
		sq.addFacetQuery("cprice_i:[51 TO 200]");
		sq.addFacetQuery("cprice_i:[201 TO *]");
		sq.setFacetPrefix("");
		sq.setFacetSort("cprice_i asc");
		sq.setQuery("cname_ik:"+search);
		QueryResponse qr = hsc.query(sq);
		
		
		
		
		Map<String, Integer> facetQuery = qr.getFacetQuery();
		hsc.commit();
		hsc.close();
	
		return qr.getFacetQuery();
	}
}


jQuery发送AJAX请求JSON数据,将获取到的数据渲染到页面


<html>
	<head>
		<meta charset="UTF-8" />
		<link rel=stylesheet href="form.css" type="text/css">
		<style>
			body {
				font-weight:bold;font-family:楷体;
			}
			#div1{
				width:100%;
				height:250px;
				/*背景图片*/
				background-image:url(1.gif);
				/*背景图片铺排方式 no-repeat:不平铺、repeat-x、repeat-y、repeat、
				round:背景图像自动缩放填充整个容器(CSS3)*/
				background-repeat:no-repeat;
			}
		</style>
		<script>
		
		
		function ss(k) {
			var str = k.value;
			$('#mark').hide();
			/*删除原有的数据信息*/
			var node = document.getElementById("content");  
            while(node.hasChildNodes()) {    
                node.removeChild(node.firstChild);    
            }    
			
            alert($('input[type=search]').val() +"AND" + str);
			$.ajax('/search', { 
                dataType: 'json',
                data:'search='+$('input[type=search]').val() +" AND " + str
            }).done(function (data) {
            	var len = data.length;
            	var bodyNode = $('#content');  
            	for(var n = 0;n<len;n++) {
            		var id = data[n].id;
            		var cname = data[n].cname;
            		var cprice = data[n].cprice;
            		bodyNode.append("<b>商品编号:"+id+"</b>");
            		bodyNode.append("<b>商品名称:"+cname+"</b>");
            		bodyNode.append("<b>商品价格:"+cprice+"</b>");
            		bodyNode.append("<hr border='5px' color='red' />");
            	}
            }).fail(function (xhr, status) { 
                alert('失败: ' + xhr.status + ', 原因: ' + status); 
            }).always(function () { 
                /*alert('请求完成: 无论成功或失败都会调用'); */
            });
			
		}
		
		function ff() {
		
			
			$('#mark').show();
			
			$.ajax('/count', { 
                dataType: 'json',
                data:'search='+$('input[type=search]').val()
            }).done(function (data) {
            	var s=$('input[type=search]').val();
            	var d = $('#mark');
            	d.html($('input[type=search]').val()+"相关信息");
            	for(var key in data) {
            		var value=data[key];
            		d.append('<dl>');
            		d.append("<dt><button width=\"200px\"" +"οnclick=\"ss(this)\" value=\""+key+"\">"+key + value +'</button></dt>');
            		d.append('</dl>');
            	}
            	
            }).fail(function (xhr, status) { 
                alert('失败: ' + xhr.status + ', 原因: ' + status); 
            }).always(function () { 
                /*alert('请求完成: 无论成功或失败都会调用'); */
            });
		}
		
		
		window.onload = function() { 
			var searchObj = $('input[type=search]');
			var offset = searchObj.offset();
			var x = offset.left;
			var y = offset.top;
			$('#mark').css('left',x).css('top',y + 2*searchObj.height()).css('width',y);
			searchObj.keydown(function (){ff();});
			//searchObj.focusout(function(){$('#mark').hide();});
			$(document).click(function(){
				$('#mark').hide();
			})
		}
			
		
			function getMessage() {
				$('#mark').hide();
				/*删除原有的数据信息*/
				var node = document.getElementById("content");  
                while(node.hasChildNodes()) {    
                    node.removeChild(node.firstChild);    
                }    
				
				$.ajax('/search', { 
	                dataType: 'json',
	                data:'search='+$('input[type=search]').val()
	            }).done(function (data) {
	            	var len = data.length;
	            	var bodyNode = $('#content');
	            	for(var n = 0;n<len;n++) {
	            		var id = data[n].id;
	            		var cname = data[n].cname;
	            		var cprice = data[n].cprice;
	            		bodyNode.append("<b>商品编号:"+id+"</b>");
	            		bodyNode.append("<b>商品名称:"+cname+"</b>");
	            		bodyNode.append("<b>商品价格:"+cprice+"</b>");
	            		bodyNode.append("<hr border='5px' color='red' />");
	            	}
	            }).fail(function (xhr, status) { 
	                alert('失败: ' + xhr.status + ', 原因: ' + status); 
	            }).always(function () { 
	                /*alert('请求完成: 无论成功或失败都会调用'); */
	            });
			}
		</script>
		<script src="/jquery-3.1.0.js"></script>
	</head>
	<body align="center">
		<div id="div1"></div>
		<input type="search" style="font-weight:bold;font-family:楷体;" placeholder="请输入搜索关键字" name="text" autofocus=autofocus required=required/>
		<button οnclick="getMessage()" style="font-family:'楷体'" list="mark">搜索</button>
		<div id="content"></div>
		<!-- <div id="mark" style="background:black;color:white;border-radius:12px;width:200px;height:200px;position:absolute;display:none;">dga</div>-->
		<datalist id="mark" style="background:black;color:white;border-radius:12px;width:200px;height:200px;position:absolute;display:none;"></datalist>
	</body>
</html>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值