solr学习之九:MoreLikeThis相似查询
2016-05-23 10:14
537 查看
在 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="true"添加到 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+name&mlt.count=3
结果如下:
2. 对应在Java代码中写入:
结果如下:
相关说明:
(1)查询参数:
id,文档主键,或使用其他唯一键;
fl,需要返回的字段
mtl.fl,根据哪些字段判断相似度
mlt.mindf,最小文档频率,所在文档的个数小于这个值的词将不用于相似判断
mlt.mintf,最小分词频率,在单个文档中出现频率小于这个值的词将不用于相似判断
mlt.count,返回相似文章个数
(2)如果setQuery中的查询条件,不是唯一结果,是多个文章,那么程序中会得到每个文章对应的moreLikeThis列表。
(3)如果遇到org.apache.solr.search.EarlyTerminatingCollectorException,则将返回条数count设置为1即可。
(4)若需根据id返回文章列表,可参考如下代码:
[java] view
plain copy
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;
}
}
HTTP 查询参数,并且大部分参数都有智能的默认值,因此我将着重讲述使用 MLT 必须了解的参数。
MoreLikeThisComponent参数
参数 说明 值域
mlt 在查询时,打开 / 关闭 MoreLikeThisComponent的布尔值。 真 | 假
mlt.count 可选。每一个结果要检索的相似文档数。 > 0
mlt.fl 用于创建 MLT 查询的字段。 模式中任何被储存的或含有检索词向量的字段。
mlt.maxqt 可选。查询词语的最大数量。由于长文档可能会有很多关键词语,
这样 MLT 查询可能会很大,从而导致反应缓慢或可怕的
TooManyClausesException,该参数只保留最关键的词语。 > 0
说明:MLT要求字段被储存或使用检索词向量,检索词向量以一种以文档为中心的方式储存信息。MLT通过文档的内容来计算文档中关键词语,然后使用原始查询词语和这些新词语创建一个新的查询。提交新查询就会返回其他查询结果。所有这些都可以用检索词向量来完成:只需将 termVectors="true"添加到 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+name&mlt.count=3
结果如下:
2. 对应在Java代码中写入:
结果如下:
相关说明:
(1)查询参数:
id,文档主键,或使用其他唯一键;
fl,需要返回的字段
mtl.fl,根据哪些字段判断相似度
mlt.mindf,最小文档频率,所在文档的个数小于这个值的词将不用于相似判断
mlt.mintf,最小分词频率,在单个文档中出现频率小于这个值的词将不用于相似判断
mlt.count,返回相似文章个数
(2)如果setQuery中的查询条件,不是唯一结果,是多个文章,那么程序中会得到每个文章对应的moreLikeThis列表。
(3)如果遇到org.apache.solr.search.EarlyTerminatingCollectorException,则将返回条数count设置为1即可。
(4)若需根据id返回文章列表,可参考如下代码:
[java] view
plain copy
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;
}
}
相关文章推荐
- 在Eclipse中运行Solr 基础知识
- Solr 5.3.0集成mmseg4j、tomcat部署、Solrj 5.3.0使用
- Solr基础--设置solr/home的三种方式
- windows下安装solr5.5.0
- Docker使用supervisor构建solr
- solr4.0安装和简单导入mysql数据
- Solr 4.0 基础教程
- 自译Solr in action中文版
- Solr In Action 中文版 第一章(一)
- Solr In Action 中文版 第一章 (二)
- Solr In Action 中文版 第一章(三)
- solr搜索引擎使用
- 基于solr实现hbase的二级索引
- 基于Nutch&Solr定向采集解析和索引搜索的整合技术指南文档
- 基于Nutch&Solr定向采集解析和索引搜索的整合技术指南文档
- Tomcat/Solr4.3.1 配置过程
- Solr Facet技术的应用与研究
- Apache Solr查询语法
- Solr客户端删除数据的方式
- Solr5.4 在 Tomcat 部署