Solrj 取出商品相似度moreLikeThis的方法

翻译 2013年12月03日 17:34:28

在solr中有两种方式实现MoreLikeThis:
第一种:SearchHandler中的MoreLikeThisComponent,MoreLikeThis以组件的身份出现,适于简单应用。
第二种:MoreLikeThisHandler,MoreLikeThis作为一个单独的Handler来处理,可以应用过滤等较复杂操作。

本文给出针对第一种的solrj实现代码,如果想对结果进行过滤,等获取到结果之后在程序中过滤掉即可,缺点是相关文档数不固定。

代码如下:

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("solr.url"));
        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("id:" + id)
                .setParam("fl", "id,title,score")
                .setParam("mlt", "true")
                .setParam("mlt.fl", "title")
                .setParam("mlt.mindf", "1")
                .setParam("mlt.mintf", "1")
                .setParam("mlt.count", String.valueOf(count));
            
            QueryResponse response =  solrServer.query(query);
            if (response == null) return articles;

            @SuppressWarnings("unchecked")
            SimpleOrderedMap<SolrDocumentList> mltResults = (SimpleOrderedMap<SolrDocumentList>) response.getResponse().get("moreLikeThis");
            for (int i = 0; i < mltResults.size(); i++) {
                SolrDocumentList items = mltResults.getVal(i);
                for (SolrDocument doc : items) {
                    String idStr = doc.getFieldValue("id").toString();
                    if (StringUtils.equals(idStr, id+"")) continue;// 排除本身
                    Article article = new Article();
                    article.setId(Integer.parseInt(idStr));
                    article.setTitle(doc.getFieldValue("title").toString());
                    articles.add(article);
                }
            }
            
        } catch (Exception e) {
            log.error("从solr获取相关新闻时遇到错误", e);
        }
        
        return articles;
    }
    
}


相关说明:
1,查询参数:
  id,文档主键,或使用其他唯一键;
  fl,需要返回的字段
  mtl.fl,根据哪些字段判断相似度
  mlt.mindf,最小文档频率,所在文档的个数小于这个值的词将不用于相似判断
  mlt.mintf,最小分词频率,在单个文档中出现频率小于这个值的词将不用于相似判断
  mlt.count,返回相似文章个数
2,如果setQuery中的查询条件,不是唯一结果,是多个文章,那么程序中会得到每个文章对应的moreLikeThis列表。
3,如果遇到org.apache.solr.search.EarlyTerminatingCollectorException,解决方案参见链接文章。

参考文档:

http://wiki.apache.org/solr/MoreLikeThis

参考:http://www.devnote.cn/article/43.html

solr学习之九:MoreLikeThis相似查询

在 Google上尝试一个查询,您会注意到每一个结果都包含一个 “相似页面” 链接,单击该链接,就会发布另一个搜索请求,查找出与起初结果类似的文档。Solr 使用MoreLikeThisCompone...
  • xiaomutoudatou
  • xiaomutoudatou
  • 2014年03月18日 09:18
  • 5109

一种简单的计算item相似度算法

计算item之间相似度是个有意义的工作,比如词的相似度就有很多应用场景。
  • lgnlgn
  • lgnlgn
  • 2015年04月05日 18:42
  • 2929

利用elasticsearch的morelikethis功能实现基于内容的相关度推荐

以前给毒app做了一个资讯推荐功能,基于内容的相关度推荐,大致步骤罗列一下主要分以下几个步骤: 1 对title和content分词提取关键词(TF-IDF),title的权重比content权重要高...
  • xiao_jun_0820
  • xiao_jun_0820
  • 2016年04月07日 16:54
  • 2688

iOS高仿淘宝商品详情页上拉翻页效果,相似度99%

  • 2017年02月10日 12:50
  • 654KB
  • 下载

python 商品名称相似度查找(difflib库和结巴分词的运用)

今天同事被告知要写一个查询商品相似度的系统,我以为事类似推荐系统一样的高大上系统,心中暗自庆幸没有被委以如此重任,不然在紧迫的时间里学习实现这套系统一定会睡眠不足的,后来同事讲解后我才知道只是一个商品...
  • u013055678
  • u013055678
  • 2016年09月29日 02:53
  • 11149

一种改进的基于知网的语义相似度计算方法

  • 2012年04月10日 20:30
  • 74KB
  • 下载

基于同义词词林的词语相似度计算方法

  • 2012年03月12日 20:53
  • 264KB
  • 下载

一种基于语境的词语相似度计算方法.pdf

  • 2010年12月05日 13:53
  • 469KB
  • 下载

文本相似度计算的一种新方法

  • 2013年02月01日 14:14
  • 110KB
  • 下载

一种改进的基于《知网》的词语相似度计算方法

  • 2009年09月16日 10:32
  • 341KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Solrj 取出商品相似度moreLikeThis的方法
举报原因:
原因补充:

(最多只允许输入30个字)