Solr API例子详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr API例子详解相关的知识,希望对你有一定的参考价值。
package test; import java.io.IOException; import java.net.MalformedURLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.util.CollectionUtil; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.FacetField.Count; 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; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.wltea.analyzer.lucene.IKAnalyzer; import com.tuke.gospel.core.vo.PaginationSupport; import com.xd.iis.se.pojos.IContentCommon; import com.xd.iis.se.pojos.SearchCondition; import com.xd.intersys.actions.BaseAction; import com.xd.intersys.ownutils.SolrWbFactory; import com.xd.intersys.pojo.IContentCommonNet; import com.xd.intersys.service.facadeImpl.ChartServiceImpl; import com.xd.intersys.service.facadeImpl.QueryServiceImpl; @SuppressWarnings("deprecation") public class SolrTest { @Autowired @Qualifier("queryService") private QueryServiceImpl queryService; @Autowired @Qualifier("chartService") private ChartServiceImpl chartService; //指定solr服务器的地址 private final static String URL = "http://192.168.20.195:8084/solr/comment"; @Test public void slorQuery() throws SolrServerException, MalformedURLException{ /* * //项目取得HttpSolrServer方式 HttpSolrServer * server=SolrWbFactory.getSolrServerComment(); * weibo_comment_solr=http://192.168.20.195:8084/solr/comment * weibo_content_comment_solr=http://192.168.20.195:8084/solr/all * weibo_content_slor=http://192.168.20.195:8084/solr/collection1 */ HttpSolrServer server = new HttpSolrServer(URL); /* * server.setConnectionTimeout(180 * 1000); server.setSoTimeout(240 * * 1000); server.setMaxTotalConnections(1200); * server.setDefaultMaxConnectionsPerHost(100); server.setMaxRetries(3); * server.setAllowCompression(true); */ // 定义查询字符串 SolrQuery query = new SolrQuery("Content:*"); // 设置查询关键字 /* query.setQuery("Content:* AND Spare3:1 "); */ // 指定查询返回字段 /* query.setParam("fl", "Content,IndexTime"); */ // 设置高亮 query.setHighlight(true).setHighlightSimplePre("<span class=‘red‘>") .setHighlightSimplePost("</span>"); query.setParam("hl.fl", "Content"); // 时间条件过滤 /* query.addFilterQuery("Content:超哥"); */ /* * query.addFilterQuery( * "Published:[1995-12-31T23:59:59.999Z TO 2016-03-06T00:00:00Z]"); */ query.addFilterQuery("Published:[* TO NOW]"); // 实现分页的查询 query.setStart(0); query.setRows(10); // 设定排序,如果需要对field进行排序就必须在schema.xml中对该field配置stored="true"属性 query.addSort(IContentCommon.IndexField.Published.getName(), SolrQuery.ORDER.asc); QueryResponse res = server.query(query); // 查询出来的结果都保存在SolrDocumentList中 SolrDocumentList sdl = res.getResults(); System.out.println("总数:" + sdl.getNumFound()); System.out.println(sdl.getMaxScore()); for (SolrDocument sd : sdl) { String id = (String) sd.get("ID"); // 打印高亮信息 System.out.println(res.getHighlighting().get(id).get("Content")); // System.out.println(sd.get("ID") + "#" + sd.get("Content") + "#" + sd.get("WeiboId") + "#" + sd.get("Published") + "#" + sd.get("OriginType")); /* System.out.println(sd.getFieldValue("ID")); */ Date date = (Date) sd.get("Published"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String dstring = sdf.format(date); System.out.println(dstring); } } @Test public void condition() throws SolrServerException, MalformedURLException{ SearchCondition sc=new SearchCondition(); sc.addFilter(null, null); sc.addHotsort(true, true); BaseAction baseAction=new BaseAction(); sc=baseAction.getSearchCondition(null, null, 1, "", "", 1, "", 1,1, "", "", 1, "",""); // QueryServiceImpl HttpSolrServer solrServer = SolrWbFactory.getSolrServerWb(); // 通过Search得到SearchCondition SolrQuery query = queryService.getQuery(sc); /* * 实际调用的SearchCondition.toQuery方法lucene的query转换成slor的 * 实际调用的getSearchBase(HttpSolrServer solrServer, SolrQuery query, * SearchCondition searchCondition, Integer page, Integer pagesize) * solrServer发送请求查询出来设置到IContentCommonNet对象中 */ PaginationSupport<IContentCommonNet> paginationSupport=queryService.getSearch(solrServer, query, sc, 1, 10); chartService.getWordCloud(paginationSupport, 300); } /* java对象 <---> xml文件之间的转换 JAXB注解JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON @XmlRootElement對类标识自动转化类中有get 、set方法的属性,没有get、set方法的属性无法转化 @XmlElement对属性标识,属性无需get、set方法 public Analyzer analyzer = new IKAnalyzer(true);//true开启智能分词 拿IKAnalyzer分词器为例,IKAnalyzer的切分方式是细粒度切分,当不需要智能处理时, 其就把切出的所有词输出,但若启动了智能处理,那么接下来就是要进行消歧工作。 智能分词结果: 张三|说的|确实|在理 最细粒度分词结果: 张三|三|说的|的确|的|确实|实在|在理 (1) TermAttribute: 表示token的字符串信息。比如"I‘m" (2) TypeAttribute: 表示token的类别信息(在上面讲到)。比如 I‘m 就属于<APOSTROPHE>,有撇号的类型 (3) OffsetAttribute:表示token的首字母和尾字母在原文本中的位置。比如 I‘m 的位置信息就是(0,3) (4) PositionIncrementAttribute:这个有点特殊,它表示tokenStream中的当前token与前一个token在实际的原文本中相隔的词语数量。 Math.round 四舍五入Math.round(1.4)=1 Math.round(1.5)=2 Math.ceil向上取整Math.ceil(1.4)=2.0 Math.floor向下取整 邮箱:[email protected] SVN账号密码 账号:yuanhai 密码:cmpz0cUx0p hbase设置 hbase_server1=192.168.1.120 hbase_server2=192.168.1.121 hbase_server3=192.168.1.122 192.168.1.120 jintai-test-0 192.168.1.121 jintai-test-1 192.168.1.122 jintai-test-2 solr地址:http://192.168.20.195:8084/solr/#/ http://blog.csdn.net/zwx19921215/article/details/41820483 http://www.cnblogs.com/chenz/articles/3229997.html http://blog.csdn.net/huoyunshen88/article/details/38082455 --------slor日期格式存储---------- TrieDateField DateField 表示一个精确到毫秒的时间,值的格式是: YYYY-MM-DD T hh:mm:ss Z --------------来源类型------------- BasicContent -------字符串转换成日期工具类----------------- DateUtilsIis.parse(strDate,strPattern) ------------错误码类型类------------------- ErrorCodeConstant //ArrayList线程安全 List<Map<String,Object>> data=Collections.synchronizedList(new ArrayList<Map<String,Object>>()); -------------监听器------------------ InitDataListener --> springmvc配置的监听器 01449763832357389257242 ----------LinkedHashMap----------- LinkedHashMap实体虽然是以Hash的顺序存放在Map的数组table里面,但是实体之间却用链表的形式保持了存入的先后关系。 LinkedHashMap保存了记录的插入顺序,所以当你需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列。 Collections.sort方法对arraylist排序 -------字段-------- Spare3:微博的的层级 Spare5:父微博的用户名 CustomFlag1=1疑似负面 CustomFlag1=2 负面 CustomFlag1=3 敏感 CustomFlag1=4 非敏感 TitleHs 标题哈希 对于微博而言,标题就是内容 UserScreenName 用户名 ClusterContent splitTypeFlg xw和app默认不拆分,归到新闻里 newlstSelect 1 为 模糊信息列表;2 表示精确信息列表 select =1 全部信息 对应着模糊搜索 newlstSelect=1 * * */ /** * 测试分组 */ @Test public void facet() throws MalformedURLException, SolrServerException{ HttpSolrServer server = new HttpSolrServer(URL); SolrQuery query = new SolrQuery("*:*"); query.setIncludeScore(false); query.setFacet(true); /* query.addFacetField("Province"); */ query.addFacetField("Spare3"); query.addFacetQuery("Spare3:[4 TO 7]"); /* * FacetComponet有两种排序选择,分别是count和index, * count是按每个词出现的次数,index是按词的字典顺序。如果查询参数不指定facet.sort,solr默认是按count排序。 */ /* query.setFacetSort("index"); */ query.setFacetSort("count"); query.setFacetLimit(10);// 设置返回结果条数 /* query.setFacetPrefix("湖");//设置前缀 */ System.out.println(query.toString()); QueryResponse res = server.query(query); /* List<Count> provinceList= res.getFacetField("Province").getValues(); */ List<Count> spare3List = res.getFacetField("Spare3").getValues(); /* * for(Count count : provinceList){ * System.out.println(count.getName()+"#"+count.getCount()); * * } */ for (Count count : spare3List) { System.out.println(count.getName() + "#" + count.getCount()); } // 得到FacetQuery结果 Map<String, Integer> facetQueryResult = res.getFacetQuery(); for (Map.Entry<String, Integer> fqr : facetQueryResult.entrySet()) { System.out.println(fqr.getKey() + ":" + fqr.getValue()); } res.getFacetDate(null); res.getFacetDates(); res.getFacetRanges(); /** * * * * 控制台输出结果: * * q=Usergender%3A*&fl=*&facet=true&facet.field=Spare3&facet.query=Spare3%3A%5B4+TO+7%5D&facet.sort=count&facet.limit=10 0#35389 4#22778 3#22333 2#16567 1#15571 6#13161 5#12339 7#11550 8#2659 9#1399 Spare3:[4 TO 7]:59828 ---------对应slor图形界面http访问url----- http://192.168.20.195:8084/solr/collection1/select?q=Usergender%3A*& wt=json&indent=true&facet=true&facet.query=Spare3%3A%5B4+TO+7%5D&facet.field=Spare3 ---------------slor图形界面查询语法------------ -------------- slor图形界面结果------------ "facet_counts": { "facet_queries": { "Spare3:[4 TO 7]": 59828 }, "facet_fields": { "Spare3": [ "0", 35389, "4", 22778, "3", 22333, "2", 16567, "1", 15571, "6", 13161, "5", 12339, "7", 11550, "8", 2659, "9", 1399, "10", 500, "11", 187, "12", 115, "13", 51, "14", 34, "15", 30, "16", 3 ] }, "facet_dates": {}, "facet_ranges": {} } facet.range http://…/select?&facet=true&facet.range=price&facet.range.start=5000&facet.range.end=8000&facet.range.gap=1000 solrconfig.xml配置 <requestHandler name="/browse" class="solr.SearchHandler" name="/select"> <lst name="defaults"> <str name="echoParams">explicit</str> <int name="rows">10</int> <str name="df">text</str> str name="facet">on</str> <str name="facet.range">Price</str> <int name="f.Price.facet.range.start">0</int> <int name="f.Price.facet.range.end">5000</int> <int name="f.Price.facet.range.gap">1000</int> </lst> </requestHandler> facet.range节点中表示按范围分段的字段为Price f.Price.facet.range.start表示起始值为0 f.Price.facet.range.end表示最大值为 5000 f.Price.facet.range.gap表示每次间隔1000进行分段 , */ } }
本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1748191
以上是关于Solr API例子详解的主要内容,如果未能解决你的问题,请参考以下文章
solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例
Solr 高亮是不是还可以指示返回的片段在原始字段中的位置或偏移量?