启动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>