﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-皮杜妮-随笔分类-搜索引擎</title><link>http://www.blogjava.net/fanjs2000/category/50612.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 15 Nov 2016 14:09:14 GMT</lastBuildDate><pubDate>Tue, 15 Nov 2016 14:09:14 GMT</pubDate><ttl>60</ttl><item><title>ElasticSearch</title><link>http://www.blogjava.net/fanjs2000/archive/2016/05/10/430423.html</link><dc:creator>猪眼睛</dc:creator><author>猪眼睛</author><pubDate>Tue, 10 May 2016 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/fanjs2000/archive/2016/05/10/430423.html</guid><description><![CDATA[ElasticSearch各个版本的apo<br /><div>https://www.elastic.co/guide/en/elasticsearch/client/java-api/2.2/index.html</div><br /><br /><img src ="http://www.blogjava.net/fanjs2000/aggbug/430423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fanjs2000/" target="_blank">猪眼睛</a> 2016-05-10 15:46 <a href="http://www.blogjava.net/fanjs2000/archive/2016/05/10/430423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Solr中的group与facet的区别 </title><link>http://www.blogjava.net/fanjs2000/archive/2016/05/03/430276.html</link><dc:creator>猪眼睛</dc:creator><author>猪眼睛</author><pubDate>Tue, 03 May 2016 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/fanjs2000/archive/2016/05/03/430276.html</guid><description><![CDATA[<div>facet 自己理解就是分组聚合用的， 如下说明</div>&nbsp;<br /><br /><br /><div>http://blog.csdn.net/a925907195/article/details/47257243</div><br /><br /><br /><div><div id="article_content">  <p>Solr中的group与facet的区别</p> <p>如果是简单的使用的话，那么Facet与group都可以用来进行数据的聚合查询，但是他们还是有很大的区别的。</p> <p>首先上facet跟group的操作：</p> <p>Facet的例子：</p> <p align="left"><strong><span style="color:#7F0055">public</span> <span style="color:#7F0055"> void</span></strong>FacetFieldQuery() <strong><span style="color:#7F0055">throws</span></strong> Exception {</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000C0">solrServer</span> = createSolrServer();</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SolrQueryquery = <strong><span style="color:#7F0055">new</span></strong>SolrQuery();<span style="color:#3F7F5F">//</span><span style="color:#3F7F5F">建立一个新的查询</span></p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setQuery(<span style="color:#2A00FF">"jobsName:</span><span style="color:#2A00FF">计算机维护</span><span style="color:#2A00FF">"</span>);</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setFacet(<strong><span style="color:#7F0055">true</span></strong>);<span style="color:#3F7F5F">//</span><span style="color:#3F7F5F">设置</span><span style="color:#3F7F5F">facet=on</span></p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#3F7F5F">// </span><span style="color:#3F7F5F">分类信息分为：薪水，发布时间，教育背景，工作经验，公司类型，工作类型</span></p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.addFacetField(<strong><span style="color:#7F0055">new</span></strong> String[] {<span style="color:#2A00FF">"salary"</span>,<span style="color:#2A00FF">"publishDate"</span>,</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#2A00FF">"educateBackground"</span>,<span style="color:#2A00FF">"jobExperience"</span>,<span style="color:#2A00FF">"companytype"</span>,<span style="color:#2A00FF">"jobsType"</span> });<span style="color:#3F7F5F">//</span><span style="color:#3F7F5F">设置需要</span><span style="color:#3F7F5F">facet</span><span style="color:#3F7F5F">的字段</span></p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setFacetLimit(10);<span style="color:#3F7F5F">// </span> <span style="color:#3F7F5F">限制</span><span style="color:#3F7F5F">facet</span><span style="color:#3F7F5F">返回的数量</span></p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setFacetMissing(<strong><span style="color:#7F0055">false</span></strong>);<span style="color:#3F7F5F">//</span><span style="color:#3F7F5F">不统计</span><span style="color:#3F7F5F">null</span><span style="color:#3F7F5F">的值</span></p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setFacetMinCount(1);<span style="color:#3F7F5F">// </span> <span style="color:#3F7F5F">设置返回的数据中每个分组的数据最小值，比如设置为</span><span style="color:#3F7F5F">1</span><span style="color:#3F7F5F">，则统计数量最小为</span><span style="color:#3F7F5F">1</span><span style="color:#3F7F5F">，不然不显示</span></p> <p align="left">&nbsp;</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#3F7F5F">//query.addFacetQuery("publishDate:[2014-04-11T00:00:00Z TO2014-04-13T00:00:00Z]");</span></p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueryResponseresponse = <span style="color:#0000C0">solrServer</span>.query(query);</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.<em><span style="color:#0000C0">out</span></em>.println(<span style="color:#2A00FF">"</span><span style="color:#2A00FF">查询时间：</span><span style="color:#2A00FF">"</span> + response.getQTime());</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;FacetField&gt;facets = response.getFacetFields();<span style="color:#3F7F5F">//</span><span style="color:#3F7F5F">返回的</span><span style="color:#3F7F5F">facet</span><span style="color:#3F7F5F">列表</span></p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color:#7F0055">for</span></strong> (FacetField facet :facets) {</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.<em><span style="color:#0000C0">out</span></em>.println(facet.getName());</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.<em><span style="color:#0000C0">out</span></em>.println(<span style="color:#2A00FF">"----------------"</span>);</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Count&gt;counts = facet.getValues();</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color:#7F0055">for</span></strong> (Count count : counts){</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.<em><span style="color:#0000C0">out</span></em>.println(count.getName()+<span style="color:#2A00FF">":"</span>+ count.getCount());</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.<em><span style="color:#0000C0">out</span></em>.println();</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p> <p align="left">&nbsp;</p> <p align="left">&nbsp;&nbsp; }</p> <p align="left">运行结果如下：</p> <p align="left">查询时间：66</p> <p align="left">salary</p> <p align="left">----------------</p> <p align="left">面议:6882</p> <p align="left">2001-4000:1508</p> <p align="left">其他:671</p> <p align="left">4001-6000:536</p> <p align="left">3000-4499:224</p> <p align="left">2000-2999:181</p> <p align="left">6001-8000:179</p> <p align="left">3000-5000:82</p> <p align="left">1000-2000:81</p> <p align="left">4500-5999:75</p> <p align="left">&nbsp;</p> <p align="left">publishDate</p> <p align="left">----------------</p> <p align="left">2014-08-05T00:00:00Z:793</p> <p align="left">2014-08-04T00:00:00Z:775</p> <p align="left">2014-07-30T00:00:00Z:601</p> <p align="left">2014-08-07T00:00:00Z:548</p> <p align="left">2014-08-06T00:00:00Z:539</p> <p align="left">2014-08-11T00:00:00Z:472</p> <p align="left">2014-08-20T00:00:00Z:439</p> <p align="left">2014-08-12T00:00:00Z:438</p> <p align="left">2014-08-01T00:00:00Z:405</p> <p align="left">2014-08-03T00:00:00Z:376</p> <p align="left">&nbsp;</p> <p align="left">educateBackground</p> <p align="left">----------------</p> <p align="left">大专:4486</p> <p align="left">本科:1872</p> <p align="left">其他:1344</p> <p align="left">不限:1147</p> <p align="left">中专:680</p> <p align="left">高中:472</p> <p align="left">薪水范围：:430</p> <p align="left">中技:161</p> <p align="left">初中:140</p> <p align="left">硕士:94</p> <p align="left">&nbsp;</p> <p align="left">jobExperience</p> <p align="left">----------------</p> <p align="left">其他:2623</p> <p align="left">不限:2249</p> <p align="left">1-3年:1770</p> <p align="left">1年:1301</p> <p align="left">2年:773</p> <p align="left">3-4年:528</p> <p align="left">3-5年:379</p> <p align="left">应届毕业生:309</p> <p align="left">5-7年:162</p> <p align="left">1年以上:136</p> <p align="left">&nbsp;</p> <p align="left">companytype</p> <p align="left">----------------</p> <p align="left">民营公司:3702</p> <p align="left">民营:2605</p> <p align="left">国企:835</p> <p align="left">股份制企业:729</p> <p align="left">其他:707</p> <p align="left">合资:632</p> <p align="left">外资（非欧美）:377</p> <p align="left">外商独资:350</p> <p align="left">外资（欧美）:271</p> <p align="left">上市公司:228</p> <p align="left">&nbsp;</p> <p align="left">jobsType</p> <p align="left">----------------</p> <p align="left">全职:10734</p> <p align="left">兼职:59</p> <p align="left">实习:39 </p> <p align="left">&nbsp;</p> <p align="left">&nbsp;</p> <p align="left">Group查询：</p> <p align="left"><span style="color:#3F5FBF">/**group</span><span style="color:#3F5FBF">查询</span></p> <p align="left"><span style="color:#3F5FBF">&nbsp;&nbsp; &nbsp;* </span><strong><span style="color:#7F9FBF">@throws</span></strong><span style="color:#3F5FBF"> Exception</span></p> <p align="left"><span style="color:#3F5FBF">&nbsp;&nbsp; &nbsp;*/</span></p> <p align="left">&nbsp;&nbsp; <strong><span style="color:#7F0055">public</span> <span style="color:#7F0055"> void</span></strong> <span style="background:silver">GroupFieldQuery</span>() <strong> <span style="color:#7F0055">throws</span></strong> Exception {</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000C0">solrServer</span> = createSolrServer();</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;SolrQuery query = <strong><span style="color:#7F0055">new</span></strong> SolrQuery(<span style="color:#2A00FF">"jobsName:</span><span style="color:#2A00FF">计算机维护</span><span style="color:#2A00FF">"</span>);</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; <span style="color:#3F7F5F">// </span><span style="color:#3F7F5F">设置通过</span><span style="color:#3F7F5F">facet</span><span style="color:#3F7F5F">查询为</span><span style="color:#3F7F5F">true</span><span style="color:#3F7F5F">，表示查询时使用</span><span style="color:#3F7F5F">facet</span><span style="color:#3F7F5F">机制</span></p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; query.setParam(GroupParams.<em><span style="color:#0000C0">GROUP</span></em>,<strong><span style="color:#7F0055">true</span></strong>);&nbsp;&nbsp;&nbsp;</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; query.setParam(GroupParams.<em><span style="color:#0000C0">GROUP_FIELD</span></em>,<span style="color:#2A00FF">"salary"</span>);</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; <span style="color:#3F7F5F">// </span><span style="color:#3F7F5F">设置每个</span><span style="color:#3F7F5F">quality</span><span style="color:#3F7F5F">对应的</span></p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; query.setParam(GroupParams.<em><span style="color:#0000C0">GROUP_LIMIT</span></em>,<span style="color:#2A00FF">"1"</span>);</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; <span style="color:#3F7F5F">// </span><span style="color:#3F7F5F">设置返回</span><span style="color:#3F7F5F">doc</span><span style="color:#3F7F5F">文档数据，因只需要数量，故设置为</span><span style="color:#3F7F5F">0</span></p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; query.setRows(10);</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; QueryResponse response = <span style="color:#0000C0">solrServer</span>.query(query);</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; <strong><span style="color:#7F0055">if</span></strong> (response !=<strong><span style="color:#7F0055">null</span></strong>) {</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GroupResponse groupResponse =response.getGroupResponse();&nbsp;&nbsp;&nbsp;</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color:#7F0055">if</span></strong>(groupResponse !=<strong><span style="color:#7F0055">null</span></strong>) {&nbsp;&nbsp;&nbsp;</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; List&lt;GroupCommand&gt; groupList =groupResponse.getValues();&nbsp; &nbsp;&nbsp;</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <strong><span style="color:#7F0055">for</span></strong>(GroupCommand groupCommand : groupList){&nbsp;&nbsp;&nbsp;</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Group&gt; groups =groupCommand.getValues();&nbsp;&nbsp;&nbsp; </p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color:#7F0055">for</span></strong>(Group group : groups) {</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; System.<em><span style="color:#0000C0">out</span></em>.println(<span style="color:#2A00FF">"group</span><span style="color:#2A00FF">查询</span><span style="color:#2A00FF">..."</span>+group.getGroupValue()+<span style="color:#2A00FF">"</span><span style="color:#2A00FF">数量为：</span><span style="color:#2A00FF">"</span>+group.getResult().getNumFound());</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; </p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; }</p> <p align="left">&nbsp;</p> <p align="left">&nbsp;&nbsp; }</p> <p align="left">group查询...面议数量为：6882</p> <p align="left">group查询...4500-5999数量为：75</p> <p align="left">group查询...2001-4000数量为：1508</p> <p align="left">group查询...其他数量为：671</p> <p align="left">group查询...2000-2999数量为：181</p> <p align="left">group查询...4001-6000数量为：536</p> <p align="left">group查询...2000-4000数量为：19</p> <p align="left">group查询...2000-3000数量为：34</p> <p align="left">group查询...3000-4499数量为：224</p> <p align="left">group查询...3000-5000数量为：82</p> <p align="left">&nbsp;</p> <p align="left">facet的查询结果主要是分组信息：有什么分组，每个分组包括多少记录；但是分组中有哪些数据是不可知道的，只有进一步搜索。<br /> group则类似于关系数据库的group by，可以用于一个或者几个字段去重、显示一个group的前几条记录等。</p> <p align="left">The Grouping feature only works if groups are inthe same  shard. You must use the custom sharding feature to use the  Groupingfeature.</p> <p align="left">&nbsp;</p> <p align="left">两者其实用起来还是有比较大的区别的，但是如果说区别的话可以看下wiki上的这段</p> <p>Field Collapsing and Result Grouping aredifferent ways to think about the same Solr feature.</p> <p>Field Collapsing collapsesa group of results with the same field  value down to a single (or fixed number)of entries. For example, most  search engines such as Google collapse on site soonly one or two entries  are shown, along with a link to click to see moreresults  from that site. Field collapsing can also be used to suppress  duplicatedocuments.</p> <p>Result Grouping groupsdocuments with a common field value into  groups, returning the top documentsper group, and the top groups based  on what documents are in the groups. Oneexample is a search at Best Buy  for a common term such as DVD, that shows thetop  3 results for each category ("TVs &amp;Video","Movies","Computers",  etc)</p> <p>&nbsp;</p> <p>下面这两个查询语句一个是facet的一个是group的</p> <p>http://localhost:8080/solr/JobsOtherWeb0/select?q=jobsName%3A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%B4%E6%8A%A4&amp;group=true&amp;group.field=salary&amp;group.limit=1&amp;rows=10</p> <p align="left"><a target="_blank" href="http://localhost:8080/solr/JobsOtherWeb0/select?q=jobsName%3A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%B4%E6%8A%A4&amp;facet=true&amp;facet.field=salary&amp;facet.field=publishDate&amp;facet.field=educateBackground&amp;facet.field=jobExperience&amp;facet.field=companytype&amp;facet.field=jobsType&amp;facet.limit=10&amp;facet.missing=false&amp;facet.mincount=1">http://localhost:8080/solr/JobsOtherWeb0/select?q=jobsName%3A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%B4%E6%8A%A4&amp;facet=true&amp;facet.field=salary&amp;facet.field=publishDate&amp;facet.field=educateBackground&amp;facet.field=jobExperience&amp;facet.field=companytype&amp;facet.field=jobsType&amp;facet.limit=10&amp;facet.missing=false&amp;facet.mincount=1</a></p> <p align="left">&nbsp;</p> <p align="left">其中facet查询出的如下：（只截取部分结果）</p> <p align="left"><img src="http://img.blog.csdn.net/20150803154622649?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><br /> </p> <p align="left"><img src="http://blog.csdn.net/a925907195/article/details/47257243" alt="" /><br /> </p> <p align="left"><img src="http://blog.csdn.net/a925907195/article/details/47257243" alt="" /><br /> </p>  <p align="left">根据条件查询出的是查询结果，facet是聚类后的信息跟查询条件是分开的，查询结果也跟facet没关系。</p> <p align="left">但是下面看group查询的</p> <p align="left"><img src="http://img.blog.csdn.net/20150803154652469?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><br /> </p> <p align="left"><img src="http://blog.csdn.net/a925907195/article/details/47257243" alt="" /><br /> </p> <p align="left"><img src="http://blog.csdn.net/a925907195/article/details/47257243" alt="" /><br /> </p>  <p align="left">也就是你的查询条件是跟group相关的，返回的查询结果也是跟group相关的，比如说你想要查询的结果在每个分组中 都有数据采集，那么就最好用group，这样出来的数据跟group也是相关的，但是有个问题，比如说你要查询group每个采集1个，ok那么你查询的 时候的条件rows就无效了（也不能说无效，主要是看你怎么使用），就是最多每个分组给你返回一个，多了没有了。</p> <p align="left">再细说点就是如果你想查询归查询聚类归聚类，那么使用facet，如果想使用类似采集的效果，每个group分组采集多少个，那么使用group查询。</p>     </div></div><img src ="http://www.blogjava.net/fanjs2000/aggbug/430276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fanjs2000/" target="_blank">猪眼睛</a> 2016-05-03 16:34 <a href="http://www.blogjava.net/fanjs2000/archive/2016/05/03/430276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义lucene的分组结果后，进行排序</title><link>http://www.blogjava.net/fanjs2000/archive/2013/09/24/399824.html</link><dc:creator>猪眼睛</dc:creator><author>猪眼睛</author><pubDate>Tue, 24 Sep 2013 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/fanjs2000/archive/2013/09/24/399824.html</guid><description><![CDATA[lucene查询结果需要先分组后排序， 看了相关文档，lucene提供了分组 排序功能，但是比较消耗内容，实际情况是 我们一般只需要前面的1000条， 所以我自己实现了排序算法，尽量少占用内容。<br />方法如下：<br /><br /><br /><div>// 分组统计方式<br />&nbsp;&nbsp; &nbsp;/**<br />&nbsp;&nbsp; &nbsp; * <br />&nbsp;&nbsp; &nbsp; * @param topnumber&nbsp; 取分组后的前几条数据 <br />&nbsp;&nbsp; &nbsp; * @return<br />&nbsp;&nbsp; &nbsp; */<br />&nbsp;&nbsp; &nbsp;public static List cachegroup(int topnumber) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int page = 30000;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String filePath = "D://lucene/index2";<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;File dirfile = new File(filePath);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Directory dir = FSDirectory.open(dirfile);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;IndexReader reader = DirectoryReader.open(dir);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;IndexSearcher indexSearcher = new IndexSearcher(reader);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String searchTerm = "aaa";<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;boolean getScores = true;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;boolean getMaxScores = true;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;boolean fillFields = true;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;GroupingSearch groupingSearch = new GroupingSearch("author");<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;groupingSearch.setGroupSort(Sort.RELEVANCE);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;groupingSearch.setFillSortFields(true);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;groupingSearch.setCachingInMB(40.0, true);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;groupingSearch.setAllGroups(true);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;TermQuery query = new TermQuery(new Term("content", searchTerm));<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;TopDocs hits = indexSearcher.search(query, 100);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int count = hits.totalHits;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int mode = count % page;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int times = count / page;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (mode != 0)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;times = times + 1;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;List indexvalue = new LinkedList();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int i = 0; i &lt; times; i++) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int groupoffset = i * page;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;TopGroups&lt;BytesRef&gt; result = groupingSearch.search(<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;indexSearcher, query, groupoffset, page);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;GroupDocs&lt;BytesRef&gt;[] gds = result.groups;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (GroupDocs&lt;BytesRef&gt; gd : gds) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;indexvalue.add(new FieldSort(gd.totalHits, gd.groupValue<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.utf8ToString()));<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Comparator comp = Collections.reverseOrder();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Collections.sort(indexvalue, comp);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;indexvalue = indexvalue.subList(0, topnumber);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return indexvalue;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (Exception ex) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ex.printStackTrace();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return null;<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;public static void&nbsp; readList(List list)<br />&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Iterator it=list.iterator();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;while(it.hasNext())<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;FieldSort fieldsort=(FieldSort)it.next();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(fieldsort.getFieldvalue()+"/"+fieldsort.getFieldname());<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br /><br /><br /><br /><br /><br /><div>package speed;<br /><br />import java.util.Comparator;<br /><br /><br /><br />public class FieldSort implements Comparable&lt;FieldSort&gt;{<br /><br />&nbsp;&nbsp; &nbsp;private int&nbsp;&nbsp;&nbsp; fieldvalue;<br />&nbsp;&nbsp; &nbsp;private String fieldname;<br />&nbsp;&nbsp; &nbsp;public FieldSort() {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;super();<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;public FieldSort(int fieldvalue,String fieldname) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;super();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.setFieldvalue(fieldvalue);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.setFieldname(fieldname);<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;public int getFieldvalue() {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return fieldvalue;<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;public void setFieldvalue(int fieldvalue) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.fieldvalue = fieldvalue;<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;public String getFieldname() {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return fieldname;<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;public void setFieldname(String fieldname) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.fieldname = fieldname;<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;@Override<br />&nbsp;&nbsp; &nbsp;public String toString(){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return fieldname+"/"+fieldvalue;<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;public int compareTo(FieldSort t){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(t==null)return 0;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else{<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return this.fieldvalue-t.fieldvalue;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;<br /><br />}</div></div><img src ="http://www.blogjava.net/fanjs2000/aggbug/399824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fanjs2000/" target="_blank">猪眼睛</a> 2013-09-24 16:34 <a href="http://www.blogjava.net/fanjs2000/archive/2013/09/24/399824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>