solr 相似查询-MoreLikeThis

  参考文档:https://lucene.apache.org/solr/guide/6_6/morelikethis.htmlMoreLikeThisMoreLikeThisHandler

  

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

  采用相似查询的field的存储方式最好采用TermVectors方式,如果field没有采用TermVectors方式,MoreLikeThis将会从store存储中生成terms。

  

  <field name="text" ... termVectors ="true"/>

  

  参数说明:

  • mlt.fl      :设置相似查询字段,最好采用TermVectors存储。
  • mlt.mintf   :最小分词频率,源文档中小于该频率的分词将被忽略掉。tf:分词后的词在该文档中的频率
  • mlt.mindf   :最小文档频率,该词所在文档的个数小于这个值时将不用于相似判断。df:该词所在文档的个数。
  • mlt.minwl :词的最小长度,当词的长度小于该值时不用于相似判断。
  • mlt.maxwl  :词的最大长度,当词的长度大于该值时不用于相似判断。
  • mlt.maxqt  :构造相似查询的terms的最大数量。
  • mlt         : true ,开启相似查询。
  • mlt.count   :为每一个相似查询结果返回指定数量的相似文档。
  • mlt.boost :相似查询是否开启加权功能。true/false
  • mlt.qf     :相似查询field字段加权设置。 

 

  简单的例子:

  http://localhost:8983/solr/data/select/?q=text:Martin&mlt=true&mlt.fl=text&mlt.mindf=1&mlt.mintf=1&mlt.fl=text&fl=id,text&mlt.count=3

  http://localhost:8983/solr/test/select/?q=*:*&mlt=true&mlt.mindf=1&mlt.mintf=1&mlt.fl=text&fl=id,text&mlt.count=3

  http://localhost:8983/solr/data/select/?q=id:20160229001cn.pdf&mlt=true&mlt.mindf=1&mlt.mintf=1&mlt.fl=text&fl=id,text&mlt.count=3

 

  java代码package main.java;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;


import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient.Builder;
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;

public class morelike {
    private static SolrClient solr;

    public morelike() {
    }

    public static void Init(String urlString) {
        solr = (new Builder(urlString)).build();
    }

    public static void main(String[] args) throws SolrServerException, IOException {
        String urlString = "http://localhost:8983/solr/mycore";
//        String path = "D:/work/Solr/ImportData";
        Init(urlString);
        getMorelikeTextById("\"160920 陈悦悦 从付费墙到会员制,国外媒体内容变现新方式?传统媒体内容变现新趋势?.docx\"");
        System.exit(0);
    }

    private static void getMorelikeTextById(String id) throws SolrServerException, IOException {
        SolrQuery params = new SolrQuery();
        params.setQuery("id:" + id);
        params.setParam("mlt", true);
        params.setParam("mlt.fl", new String[]{"text"});
        params.setFields(new String[]{"id,text"});
        params.setParam("mlt.count", new String[]{"1"});
        params.setParam("mlt.mintf", new String[]{"10"});
        params.setParam("mlt.mindf", new String[]{"5"});
        QueryResponse queryResponse = solr.query(params);
        SimpleOrderedMap<SolrDocumentList> mltResults = (SimpleOrderedMap<SolrDocumentList>)queryResponse.getMoreLikeThis();
//        SimpleOrderedMap<SolrDocumentList> mltResults = (SimpleOrderedMap<SolrDocumentList>)queryResponse.getResponse().get("moreLikeThis");
        for (int i = 0; i < mltResults.size(); i++) {
            SolrDocumentList items = mltResults.getVal(i);
            for (SolrDocument doc : items) {
                String id1 = doc.getFieldValue("id").toString();
                System.out.println(id1);
            }
        }


    }
}
}

 

posted on 2017-12-08 13:30  shaomine  阅读(945)  评论(0编辑  收藏  举报