Solr调用示例

来源:互联网 发布:2k16捏脸数据科比 编辑:程序博客网 时间:2024/06/06 00:05
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();
}
}


}
0 0
原创粉丝点击