solr4.10 配置相似查询 MoreLikeThisComponent(MLT)和 MoreLikeThisHandler
相关说明:Solr 使用 MoreLikeThisComponent(MLT)和 MoreLikeThisHandler 实现了一样的功能。如上所述,MLT 是与标准 SolrRequestHandler 集成在一起的;MoreLikeThisHandler 与 MLT 结合在一起,并添加了一些其他选项,但它要求发布一个单一的请求。我将着重讲述 MLT,因为使用它的可能性更大一些。幸运的是,不需要任何设置就可以查询它,所以您现在就可以开始查询。
MLT 要求字段被储存或使用检索词向量,检索词向量以一种以文档为中心的方式储存信息。MLT 通过文档的内容来计算文档中关键词语,然后使用原始查询词语和这些新词语创建一个新的查询。提交新查询就会返回其他查询结果。所有这些都可以用检索词向量来完成:只需将 termVectors="true" 添加到 schema.xml 中的 <field> 声明。
查询参数:
id,文档主键,或使用其他唯一键;
mlt 在查询时,打开/关闭 MoreLikeThisComponent 的布尔值。真|假
fl,需要返回的字段
mtl.fl,根据哪些字段判断相似度
mlt.mindf,最小文档频率,所在文档的个数小于这个值的词将不用于相似判断
mlt.mintf,最小分词频率,在单个文档中出现频率小于这个值的词将不用于相似判断
mlt.count,返回相似文章个数
方法一:MoreLikeThisComponent
要查询的字段 <field name="ask" termVectors="true"/> try {
HttpSolrServer server =ServerManager.getInstance();
SolrQuery query = new SolrQuery();
query.setQuery("ask:吃饭吧");
//mlt在查询时,打开/关闭 MoreLikeThisComponent 的布尔值
query.setParam("mlt", "true");
//fl 需要返回的字段
query.setParam("fl", "score,ask");
//mtl.fl 根据哪些字段判断相似度
query.setParam("mlt.fl", "ask");
//mlt.mintf 最小分词频率,在单个文档中出现频率小于这个值的词将不用于相似判断
query.setParam("mlt.mintf", "1");
//mlt.mindf 最小文档频率,所在文档的个数小于这个值的词将不用于相似判断
query.setParam("mlt.mindf", "1");
QueryResponse response = server.query(query);
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) {
System.out.println(doc.getFieldValue("ask"));
System.out.println(doc.getFieldValue("score"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
方法二:MoreLikeThisHandler
首先在 solrconfig.xml 中配置 MoreLikeThisHandler<requestHandler name="/mlt" class="solr.MoreLikeThisHandler"></requestHandler>
try {
HttpSolrServer server =ServerManager.getInstance();
SolrQuery query = new SolrQuery();
query.setRequestHandler("/mlt");
query.setQuery("ask:吃饭吧");
//mlt在查询时,打开/关闭 MoreLikeThisComponent 的布尔值
query.setParam("mlt", "true");
//fl 需要返回的字段
query.setParam("fl", "score,ask");
//mtl.fl 根据哪些字段判断相似度
query.setParam("mlt.fl", "ask");
//mlt.mintf 最小分词频率,在单个文档中出现频率小于这个值的词将不用于相似判断
query.setParam("mlt.mintf", "1");
//mlt.mindf 最小文档频率,所在文档的个数小于这个值的词将不用于相似判断
query.setParam("mlt.mindf", "1");
QueryResponse resp = server.query(query);
SolrDocumentList sdl = resp.getResults();
System.out.println(sdl.getNumFound());
for(SolrDocument sd:sdl) {
System.out.println(sd.getFieldValue("ask"));
System.out.println(sd.getFieldValue("score"));
}
} catch (Exception e) {
e.printStackTrace();
}
涨姿势了
页:
[1]