package com.travel.core.solr;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.impl.XMLResponseParser;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
public class SolrJClient {
private SolrClient solrClient=null;
public static void main(String[] args) throws SolrServerException, IOException {
SolrJClient client = new SolrJClient();
//client.connectionCloudSolr("192.168.221.1:9983", "gettingstarted");
client.connectionSolr();
String str = "我是一个测试程序你知道吗,看看可以生成什么样的结果啊,也许符合你的预期,也许不符合!";
Random random = new Random(30);// 指定种子数100
// System.out.println("随机数:"+(int)(Math.random()*30));
ExecDuration.startExec("add100");
for (int i = 0; i < 10; i++) {
try {
RecordVideo rv = new RecordVideo((int) (Math.random() * 8999 + 1000),
"标题" + str.substring((int) (Math.random() * 30)),
"北京" + str.substring((int) (Math.random() * 30)), "城市观光",
"主题活动" + str.substring((int) (Math.random() * 30)));
client.addData(rv);
} catch (Exception e) {
e.printStackTrace();
}
}
ExecDuration.endExec("add100");
client.QueryByKey();
}
public SolrJClient() {
}
// SolrJ提供的查询功能比较强大,可以进行结果中查询、范围查询、排序等。
public QueryResponse Search(String[] field, String[] key, Page page, String[] sortfield, Boolean[] flag,
Boolean hightlight) {
// 检测输入是否合法
if (null == field || null == key || field.length != key.length) {
return null;
}
if (null == sortfield || null == flag || sortfield.length != flag.length) {
return null;
}
SolrQuery query = null;
try {
// 初始化查询对象
query = new SolrQuery(field[0] + ":" + key[0]);
for (int i = 0; i < field.length; i++) {
query.addFilterQuery(field[i] + ":" + key[i]);
}
//设置分页 start=0就是从0开始,,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了。
query.setStart((page.getCurrentPage()-1)*page.getPerPageSize());
query.setRows(page.getPerPageSize());
//设置排序
for (int i = 0; i < sortfield.length; i++) {
if (flag[i]) {
query.addSort(sortfield[i], SolrQuery.ORDER.asc);
} else {
query.addSort(sortfield[i], SolrQuery.ORDER.desc);
}
}
//设置高亮
if (null != hightlight) {
query.setHighlight(true); // 开启高亮组件
query.addHighlightField("title");// 高亮字段
query.setHighlightSimplePre("<font color='red'>");//标记,高亮关键字前缀
query.setHighlightSimplePost("</font>");//后缀
query.setHighlightSnippets(2);//结果分片数,默认为1
query.setHighlightFragsize(1000);//每个分片的最大长度,默认为100
//分片信息
query.setFacet(true)
.setFacetMinCount(1)
.setFacetLimit(5)//段
.addFacetField("title");//分片字段
}
} catch (Exception e) {
e.printStackTrace();
}
QueryResponse rsp = null;
try {
rsp = solrClient.query(query);
} catch (Exception e) {
e.printStackTrace();
return null;
}
// 返回查询结果
return rsp;
}
public void QueryByKey(){
String[] fields={"title"};
String[] keys={"*符合*"};
QueryResponse rsp = Search(fields, keys, new Page(), new String[0], new Boolean[0], true);
if(null == rsp){
return;
}
Map<String,Map<String,List<String>>> highlightMap = rsp.getHighlighting();
//Item即为上面定义的bean类
SolrDocumentList list = rsp.getResults();
List rvList=new ArrayList<RecordVideo>();
String rvId="";
for (SolrDocument solrDocument : list) {
RecordVideo rv=new RecordVideo();
rvId=solrDocument.getFieldValue("id").toString();
rv.setId(Integer.valueOf(rvId));
rv.setActivity(solrDocument.getFieldValue("activity").toString());
rv.setPosition(solrDocument.getFieldValue("position").toString());
rv.setVideoType(solrDocument.getFieldValue("videoType").toString());
List<String> titleList=highlightMap.get(rvId).get("title");
if(titleList!=null && titleList.size()>0){
rv.setTitle(titleList.get(0));
}else{
//获取并设置高亮的字段title
rv.setTitle(solrDocument.getFieldValue("title").toString());
}
System.out.println(rv.toString());
rvList.add(rv);
}
}
// 据查询结果删除:
public void deleteQueryResult() {
try {
// 删除所有的索引
solrClient.deleteByQuery("*:*");
solrClient.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
//根据索引号删除索引:
public void deleteById(String ids) {
try {
solrClient.deleteById(ids);
solrClient.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
//添加数据
private void addData(RecordVideo rv) throws SolrServerException, IOException {
try {
solrClient.addBean(rv);
} catch (Exception e) {
solrClient.rollback();
e.printStackTrace();
} finally {
try {
solrClient.optimize();
solrClient.commit();
System.out.println("添加数据:" + rv.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
//创建到Solr的链接
private Boolean isConnSolr=false;
private void connectionCloudSolr(String zkHost, String collection) {
try {
/**
cloudSolrClient = new CloudSolrClient(zkHost);
cloudSolrClient.setDefaultCollection(collection);
cloudSolrClient.setZkClientTimeout(100);
cloudSolrClient.setZkConnectTimeout(100);
*/
isConnSolr=true;
} catch (Exception e) {
isConnSolr=false;
e.printStackTrace();
}
}
public void connectionSolr(){
try {
String urlString = "http://localhost:8983/solr/travel_core";
solrClient= new HttpSolrClient(urlString);
//solrClient.setDefaultCollection(collection);
isConnSolr=true;
} catch (Exception e) {
isConnSolr=false;
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.impl.XMLResponseParser;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
public class SolrJClient {
private SolrClient solrClient=null;
public static void main(String[] args) throws SolrServerException, IOException {
SolrJClient client = new SolrJClient();
//client.connectionCloudSolr("192.168.221.1:9983", "gettingstarted");
client.connectionSolr();
String str = "我是一个测试程序你知道吗,看看可以生成什么样的结果啊,也许符合你的预期,也许不符合!";
Random random = new Random(30);// 指定种子数100
// System.out.println("随机数:"+(int)(Math.random()*30));
ExecDuration.startExec("add100");
for (int i = 0; i < 10; i++) {
try {
RecordVideo rv = new RecordVideo((int) (Math.random() * 8999 + 1000),
"标题" + str.substring((int) (Math.random() * 30)),
"北京" + str.substring((int) (Math.random() * 30)), "城市观光",
"主题活动" + str.substring((int) (Math.random() * 30)));
client.addData(rv);
} catch (Exception e) {
e.printStackTrace();
}
}
ExecDuration.endExec("add100");
client.QueryByKey();
}
public SolrJClient() {
}
// SolrJ提供的查询功能比较强大,可以进行结果中查询、范围查询、排序等。
public QueryResponse Search(String[] field, String[] key, Page page, String[] sortfield, Boolean[] flag,
Boolean hightlight) {
// 检测输入是否合法
if (null == field || null == key || field.length != key.length) {
return null;
}
if (null == sortfield || null == flag || sortfield.length != flag.length) {
return null;
}
SolrQuery query = null;
try {
// 初始化查询对象
query = new SolrQuery(field[0] + ":" + key[0]);
for (int i = 0; i < field.length; i++) {
query.addFilterQuery(field[i] + ":" + key[i]);
}
//设置分页 start=0就是从0开始,,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了。
query.setStart((page.getCurrentPage()-1)*page.getPerPageSize());
query.setRows(page.getPerPageSize());
//设置排序
for (int i = 0; i < sortfield.length; i++) {
if (flag[i]) {
query.addSort(sortfield[i], SolrQuery.ORDER.asc);
} else {
query.addSort(sortfield[i], SolrQuery.ORDER.desc);
}
}
//设置高亮
if (null != hightlight) {
query.setHighlight(true); // 开启高亮组件
query.addHighlightField("title");// 高亮字段
query.setHighlightSimplePre("<font color='red'>");//标记,高亮关键字前缀
query.setHighlightSimplePost("</font>");//后缀
query.setHighlightSnippets(2);//结果分片数,默认为1
query.setHighlightFragsize(1000);//每个分片的最大长度,默认为100
//分片信息
query.setFacet(true)
.setFacetMinCount(1)
.setFacetLimit(5)//段
.addFacetField("title");//分片字段
}
} catch (Exception e) {
e.printStackTrace();
}
QueryResponse rsp = null;
try {
rsp = solrClient.query(query);
} catch (Exception e) {
e.printStackTrace();
return null;
}
// 返回查询结果
return rsp;
}
public void QueryByKey(){
String[] fields={"title"};
String[] keys={"*符合*"};
QueryResponse rsp = Search(fields, keys, new Page(), new String[0], new Boolean[0], true);
if(null == rsp){
return;
}
Map<String,Map<String,List<String>>> highlightMap = rsp.getHighlighting();
//Item即为上面定义的bean类
SolrDocumentList list = rsp.getResults();
List rvList=new ArrayList<RecordVideo>();
String rvId="";
for (SolrDocument solrDocument : list) {
RecordVideo rv=new RecordVideo();
rvId=solrDocument.getFieldValue("id").toString();
rv.setId(Integer.valueOf(rvId));
rv.setActivity(solrDocument.getFieldValue("activity").toString());
rv.setPosition(solrDocument.getFieldValue("position").toString());
rv.setVideoType(solrDocument.getFieldValue("videoType").toString());
List<String> titleList=highlightMap.get(rvId).get("title");
if(titleList!=null && titleList.size()>0){
rv.setTitle(titleList.get(0));
}else{
//获取并设置高亮的字段title
rv.setTitle(solrDocument.getFieldValue("title").toString());
}
System.out.println(rv.toString());
rvList.add(rv);
}
}
// 据查询结果删除:
public void deleteQueryResult() {
try {
// 删除所有的索引
solrClient.deleteByQuery("*:*");
solrClient.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
//根据索引号删除索引:
public void deleteById(String ids) {
try {
solrClient.deleteById(ids);
solrClient.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
//添加数据
private void addData(RecordVideo rv) throws SolrServerException, IOException {
try {
solrClient.addBean(rv);
} catch (Exception e) {
solrClient.rollback();
e.printStackTrace();
} finally {
try {
solrClient.optimize();
solrClient.commit();
System.out.println("添加数据:" + rv.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
//创建到Solr的链接
private Boolean isConnSolr=false;
private void connectionCloudSolr(String zkHost, String collection) {
try {
/**
cloudSolrClient = new CloudSolrClient(zkHost);
cloudSolrClient.setDefaultCollection(collection);
cloudSolrClient.setZkClientTimeout(100);
cloudSolrClient.setZkConnectTimeout(100);
*/
isConnSolr=true;
} catch (Exception e) {
isConnSolr=false;
e.printStackTrace();
}
}
public void connectionSolr(){
try {
String urlString = "http://localhost:8983/solr/travel_core";
solrClient= new HttpSolrClient(urlString);
//solrClient.setDefaultCollection(collection);
isConnSolr=true;
} catch (Exception e) {
isConnSolr=false;
e.printStackTrace();
}
}
}