设为首页 收藏本站
查看: 1058|回复: 0

[经验分享] solr学习之九:MoreLikeThis相似查询

[复制链接]

尚未签到

发表于 2015-11-12 08:31:35 | 显示全部楼层 |阅读模式
  在 Google上尝试一个查询,您会注意到每一个结果都包含一个 “相似页面” 链接,单击该链接,就会发布另一个搜索请求,查找出与起初结果类似的文档。Solr 使用MoreLikeThisComponent(MLT)和 MoreLikeThisHandler实现了一样的功能。如上所述,MLT 是与标准 SolrRequestHandler集成在一起的;MoreLikeThisHandler与 MLT 结合在一起,并添加了一些其他选项,但它要求发布一个单一的请求。我将着重讲述 MLT,因为使用它的可能性更大一些。幸运的是,不需要任何设置就可以查询它,所以您现在就可以开始查询。您可以向请求添加很多
HTTP 查询参数,并且大部分参数都有智能的默认值,因此我将着重讲述使用 MLT 必须了解的参数。
  



MoreLikeThisComponent参数

参数                                          说明                                                                               值域

mlt                  在查询时,打开 / 关闭 MoreLikeThisComponent的布尔值。      真 | 假

mlt.count       可选。每一个结果要检索的相似文档数。                                            > 0

mlt.fl               用于创建 MLT 查询的字段。                              模式中任何被储存的或含有检索词向量的字段。
  mlt.maxqt      可选。查询词语的最大数量。由于长文档可能会有很多关键词语,
  这样 MLT 查询可能会很大,从而导致反应缓慢或可怕的
  TooManyClausesException,该参数只保留最关键的词语。           > 0

说明:MLT要求字段被储存或使用检索词向量,检索词向量以一种以文档为中心的方式储存信息。MLT通过文档的内容来计算文档中关键词语,然后使用原始查询词语和这些新词语创建一个新的查询。提交新查询就会返回其他查询结果。所有这些都可以用检索词向量来完成:只需将 termVectors=&quot;true&quot;添加到 schema.xml 中的 <field>声明。
  
  尝试下面的样例查询,然后检查返回结果中的 moreLikeThis部分:

1. 在URL中输入:

http://localhost:8080/solr/select/?q=*%3A*&mlt=true&mlt.mindf=1&mlt.mintf=1 &mlt.fl=name&fl=id%2C&#43;name&mlt.count=3
  结果如下:
DSC0000.jpg




  2. 对应在java代码中写入:
DSC0001.jpg




  结果如下:
DSC0002.jpg





相关说明:

(1)查询参数:

id,文档主键,或使用其他唯一键;

fl,需要返回的字段

mtl.fl,根据哪些字段判断相&#20284;度

mlt.mindf,最小文档频率,所在文档的个数小于这个&#20540;的词将不用于相&#20284;判断

mlt.mintf,最小分词频率,在单个文档中出现频率小于这个&#20540;的词将不用于相&#20284;判断

mlt.count,返回相&#20284;文章个数

(2)如果setQuery中的查询条件,不是唯一结果,是多个文章,那么程序中会得到每个文章对应的moreLikeThis列表。

(3)如果遇到org.apache.solr.search.EarlyTerminatingCollectorException,则将返回条数count设置为1即可。

(4)若需根据id返回文章列表,可参考如下代码:

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
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.util.SimpleOrderedMap;
import base.util.ConfigUtil;
import demo.bean.Article;
public class SolrService {
private static Logger log = Logger.getLogger(SolrService.class);
private static HttpSolrServer solrServer;
static {
solrServer = new HttpSolrServer(ConfigUtil.getValue(&quot;solr.url&quot;));
solrServer.setConnectionTimeout(5000);
}
/*
* 根据文章标题查相关文章。
*
* @param id 指定文章(文档)id
* @param count 返回条数
* @return 相关文章对象列表
*/
public static List<Article> getRelated(int id, int count) {
SolrQuery query = new SolrQuery();
List<Article> articles = new ArrayList<Article>();
try {
query.setQuery(&quot;id:&quot; + id)
.setParam(&quot;fl&quot;, &quot;id,title,score&quot;)
.setParam(&quot;mlt&quot;, &quot;true&quot;)
.setParam(&quot;mlt.fl&quot;, &quot;title&quot;)
.setParam(&quot;mlt.mindf&quot;, &quot;1&quot;)
.setParam(&quot;mlt.mintf&quot;, &quot;1&quot;)
.setParam(&quot;mlt.count&quot;, String.valueOf(count));
QueryResponse response = solrServer.query(query);
if (response == null) return articles;
@SuppressWarnings(&quot;unchecked&quot;)
SimpleOrderedMap<SolrDocumentList> mltResults = (SimpleOrderedMap<SolrDocumentList>) response.getResponse().get(&quot;moreLikeThis&quot;);
for (int i = 0; i < mltResults.size(); i++) {
SolrDocumentList items = mltResults.getVal(i);
for (SolrDocument doc : items) {
String idStr = doc.getFieldValue(&quot;id&quot;).toString();
if (StringUtils.equals(idStr, id+&quot;&quot;)) continue;// 排除本身
Article article = new Article();
article.setId(Integer.parseInt(idStr));
article.setTitle(doc.getFieldValue(&quot;title&quot;).toString());
articles.add(article);
}
}
} catch (Exception e) {
log.error(&quot;从solr获取相关新闻时遇到错误&quot;, e);
}
return articles;
}
}
         
版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138104-1-1.html 上篇帖子: solr 创建日期索引字段和日期查询 下篇帖子: solr 5.0.0 bin/start脚本详细解析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表