solrj的基本使用和Facet,Group分组

###########################################################################################

Group 和 Facet的区别就是:

查询条件是跟group相关的,返回的查询结果也是跟group相关的,比如说你想要查询的结果在每个分组中都有数据采集,那么就最好用group,这样出来的数据跟group也是相关的,但是有个问题,比如说你要查询group每个采集1个,ok那么你查询的时候的条件rows就无效了(也不能说无效,主要是看你怎么使用),就是最多每个分组给你返回一个,多了没有了。

再细说点就是如果你想查询归查询聚类归聚类,那么使用facet,如果想使用类似采集的效果,每个group分组采集多少个,那么使用group查询。

###########################################################################################

public class TestSimpleSolr {

private static final String solrUrl = "http://127.0.0.1:8080/solr/";

private static final String solrCore = "solrcore1";

// 进行 Facet 的也必须 在配置文件中 INDEX = true

@Test

public void testQueryFacet() throws Exception {

HttpSolrClient client = new HttpSolrClient(solrUrl);

SolrQuery query = new SolrQuery("手机");

query.setStart(0); //索引

query.setRows(20); //每页显示20条

query.set("df", "item_keywords"); //默认域

query.addSort("item_price", ORDER.asc); //排序

query.addSort("item_cname", ORDER.desc);

query.addSort("id", ORDER.asc);

//query.setFields("id"); //设置返回的域 只返回id 其他为NULL 这个就是FL

query.addFilterQuery("item_price:[100000 TO 1000000]"); //添加过滤条件

/**  ----------Facet相关--------------  **/

query.setFacet(true); //设置开启facet

query.setFacetMinCount(1); // 设置返回的数据中每个分组的数据最小值,比如设置为1,则统计数量最小为1,不然不显示

query.setFacetLimit(10); // 限制facet返回的数量

// query.addFacetField("item_cname","item_price"); //设置需要facet的字段

query.addFacetField("item_cname"); //设置需要facet的字段

query.addFacetQuery("item_price:[1 TO 100000]"); //设置facetQuery

query.addFacetQuery("item_price:[100000 TO 1000000]");

query.addFacetQuery("item_price:[1000000 TO *]");

query.setFacetMissing(false); //不统计null的值

query.setFacetSort(FacetParams.FACET_SORT_COUNT);

/**  ----------Facet相关--------------  **/

/** -------------Highlight相关--------- **/

query.setHighlight(true); //设置高亮

query.addHighlightField("item_title"); //设置高亮的域

query.setHighlightSimplePre("<H1>"); //前缀

query.setHighlightSimplePost("</H1>"); //后缀

/** -------------Highlight相关--------- **/

QueryResponse response = client.query(solrCore, query);

/** ----------Facet处理结果相关---------- **/

Map<String, Integer> facetQuery = response.getFacetQuery();

for (Map.Entry<String, Integer> map : facetQuery.entrySet()) {

System.out.println(map.getKey() + ":" + map.getValue());

}

List<FacetField> facetFields = response.getFacetFields();

for (FacetField ff : facetFields) {

System.out.println("------------------");

System.out.println(ff.getName() + ":" + ff.getValueCount());

List<Count> counts = ff.getValues();

for (Count count : counts) {

System.out.println("name=" + count.getName() + "\tcount=" + count.getCount());

}

System.out.println("--------------------");

}

/** ----------Facet处理结果相关---------- **/

SolrDocumentList result = response.getResults();

/** ----------Highlight处理结果相关 ------------ **/

for (SolrDocument doc : result) {

Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();

List<String> list = highlighting.get(doc.get("id")).get("item_title");

if (list != null) {

doc.setField("item_title", list.get(0));

}

}

/** ----------Highlight处理结果相关 ------------ **/

System.out.println("状态 = " + response.getStatus());

long numFound = result.getNumFound();

System.out.println("查询总数 = " + numFound);

List<SolrItem> beans = SolrUtil.getBeans(SolrItem.class, result);

for (SolrItem solrItem : beans) {

System.out.println(solrItem);

}

client.close();

}

//进行Group by的必须索引 Index = true

@Test

public void testGroup() throws Exception {

HttpSolrClient client = new HttpSolrClient(solrUrl);

SolrQuery query = new SolrQuery("手机");

query.set("df", "item_keywords"); //默认域

query.setParam(GroupParams.GROUP, true);

query.setParam(GroupParams.GROUP_FIELD, "item_cname");

query.setParam(GroupParams.GROUP_QUERY, "item_price:[100000 TO 1000000]", "item_price:[1000000 TO *]");

query.setParam(GroupParams.GROUP_LIMIT, "1");

query.setStart(0); //索引

query.setRows(20); //每页显示20条

QueryResponse response = client.query(solrCore ,query);

if (response != null) {

GroupResponse groupResponse = response.getGroupResponse();

if (groupResponse != null) {

List<GroupCommand> groupList = groupResponse.getValues();

for (GroupCommand groupCommand : groupList) {

List<Group> groups = groupCommand.getValues();

for (Group group : groups) {

System.out.println(group.getGroupValue() + ":" + group.getResult().getNumFound());

}

}

}

}

client.close();

}

@Test

public void testAdd() throws Exception {

HttpSolrClient client = new HttpSolrClient(solrUrl);

String sql = "SELECT"+

" t1.id,t1.title as item_title,"+

" t1.cid as item_cid,"+

" t1.sell_point as item_sell_point,"+

" t1.price as item_price,"+

" t1.num as item_num,t1.image as item_image,"+

" t2.name as item_cname,"+

" t3.item_desc"+

" FROM"+

" tb_item t1"+

" LEFT JOIN tb_item_cat t2 ON t1.cid = t2.id"+

" LEFT JOIN tb_item_desc t3 ON t1.id = t3.item_id";

List<SolrItem> list = new BaseDao().findResult(SolrItem.class, sql);

long start = System.currentTimeMillis();

SolrUtil.addBeans(list, client, solrCore);

long end = System.currentTimeMillis();

System.out.println(end - start);

}

@Test

public void testDel() throws Exception {

HttpSolrClient client = new HttpSolrClient(solrUrl);

SolrUtil.deleteByQuery(client, solrCore, "*:*");

client.commit(solrCore);

}

}

时间: 2024-10-11 17:59:32

solrj的基本使用和Facet,Group分组的相关文章

Dubbo-admin无法显示Group分组信息

背景: 在首次使用Dubbo的时候,我们可能都会使用Dubbo-admin来监控服务的提供者和消费者,但是在自己的生产者成功运行的时候,在Dubbo-admin却看不到任何信息.如果在确保代码的正确无误,无法解决这个问题,有可能是因为Group造成的,即是在进行注册的时候,在注册中心添加了分组. 解决 1.在服务提供者不添加group分组信息的时候,会默认注册到zookeeper的dubbo组下. 在zookeeper的bin目录下(我的是/data/home/server/zookeeper-

mongodb group分组(最详细、最通俗、最易理解的讲解)

和数据库一样group常常用于统计.MongoDB的group还有很多限制,如:返回结果集不能超过16M, group操作不会处理超过10000个唯一键,好像还不能利用索引[不很确定]. Group大约需要一下几个参数. 1.key:用来分组文档的字段.和keyf两者必须有一个 2.keyf:可以接受一个javascript函数.用来动态的确定分组文档的字段.和key两者必须有一个 3.initial:reduce中使用变量的初始化 4.reduce:执行的reduce函数.函数需要返回值. 5

mongodb命令行group分组和java代码中group分组

group分组统计是数据库比较常用的功能,mongodb也不例外.不过相对于普通的增删改查,group操作就略微麻烦一些, 这里对group在shell中的操作.使用java原生代码操作以及集成spring进行操作进行一个简单的归纳总结,分组的途径和方法应该都有多种,这里每一样只举一例. 本例中数据源如下: 需要使用group实现的目的是:按年龄分组统计出每一组的数量. 1.mongo shell中执行如下命令: db.test.group({ key:{"age":1}, initi

C# 中正则表达式 Group 分组【转】

http://www.cnblogs.com/kiant71/archive/2010/08/14/1799799.html 在一个正则表达式中,如果要提取出多个不同的部分(子表达式项),需要用到分组功能. 在 C# 正则表达式中,Regex 成员关系如下,其中 Group 是其分组处理类. Regex –> MatcheCollection (匹配项集合) –> Match (单匹配项 内容) –> GroupCollection (单匹配项中包含的 "(分组/子表达式项)&

浅析mongodb中group分组

这篇文章主要介绍了浅析mongodb中group分组的实现方法及示例,非常的简单实用,有需要的小伙伴可以参考下. group做的聚合有些复杂.先选定分组所依据的键,此后MongoDB就会将集合依据选定键值的不同分成若干组.然后可以通过聚合每一组内的文档,产生一个结果文档.和数据库一样group常常用于统计.MongoDB的group还有很多限制,如:返回结果集不能超过16M, group操作不会处理超过10000个唯一键,好像还不能利用索引[不很确定]. 一.Group大约需要一下几个参数. 1

SQL group 分组查询

1.使用group by进行分组查询  在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:  被分组的列 为每个分组返回一个值得表达式,例如用一个列名作为参数的聚合函数group by的使用在这只写几个例子吧:例: select courseID,avg(score) as 课程平均成绩 from score group by courseID 例: select studentID as 学员编号,courseID as 内部测试,a

mongodb group分组

先插入测试数据: for(var i=1; i<20; i++){ var num=i%6; db.test.insert({_id:i,name:"user_"+i,age:num}); } 说明,如果有_id这个,mongodb就不会生成_id,会采用你提供的_id. 1.普通分组查询 db.test.group({key:{age:true},initial:{num:0},$reduce:function(doc,prev){ prev.num++ }}); [ { &q

MySQL数据库:group分组

group by:分组 GroupBy语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)".它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理. # group by 字段名 having 条件表达式 分组查询 select sName from elogs inner join students on sID = sNo group by sNo having count(sid)>=2; # having 与

Solr facet.date分组查询numFound结果数和docs结果数量不一致问题

解决办法: http://stackoverflow.com/questions/16935696/solr-facet-date-count-wrong Tried date faceting in Solr 4.2.1 and it is not returning correct values. It has been deprecated like the wiki says. Instead I tried range faceting and it works fine: q=*:*