TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
相关说明:
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();
- }
复制代码
|
|