Solr相似匹配

在网页搜索或电商产品搜索结果页面,很多时候会看到一个相似文档、相似产品或找相似的链接。Solr 使用 MoreLikeThisComponent(MLT)和 MoreLikeThisHandler 实现了一样的功能。如上所述,MLT 是与标准 SolrRequestHandler 集成在一起的;MoreLikeThisHandler 与 MLT 结合在一起,并添加了一些其他选项,但它要求发布一个单一的请求。我将着重讲述 MLT,因为使用它的可能性更大一些。
MLT 要求字段被储存或使用检索词向量,检索词向量以一种以文档为中心的方式储存信息。MLT 通过文档的内容来计算文档中关键词语,然后使用原始查询词语和这些新词语创建一个新的查询。提交新查询就会返回其他查询结果。所有这些都可以用检索词向量来完成:只需将 termVectors="true" 添加到 schema.xml 中的 <field> 声明。

查询参数

id,文档主键,或使用其他唯一键;
fl,需要返回的字段
mtl.fl,根据哪些字段判断相似度
mlt.mindf,最小文档频率,所在文档的个数小于这个值的词将不用于相似判断
mlt.mintf,最小分词频率,在单个文档中出现频率小于这个值的词将不用于相似判断
mlt.count,返回相似文章个数
需要注意的是 mlt.fl 中的 field 的 termVectors=true 才有效果。
<field  name=“title" type="text_smartcn"  indexed="false" stored="true"  multiValued="false"  termVectors="true"/>
public static void addIndex(){HttpSolrClient server = solrServer.getServer();List<ProductBO> list = new ArrayList<>();ProductBO bo1 = new ProductBO();bo1.setId("1001");bo1.setTitle("海尔模卡 (MOOKA) 65K5 65寸安卓智能网络窄边框全高清LED液晶电视");bo1.setMajor_s("家用电器");bo1.setSubMajor_s("电视");bo1.setBrand_s("海尔");bo1.setModel_s("65K5");bo1.setPrice_i(5400);list.add(bo1);bo1 = new ProductBO();bo1.setId("1002");bo1.setTitle("三星 (SANSUNG) UA55JU5900JXXZ 55英寸 4K超高清智能 LED液晶电视 黑色");bo1.setMajor_s("家用电器");bo1.setSubMajor_s("电视");bo1.setModel_s("UA55JU5900");bo1.setBrand_s("三星");bo1.setPrice_i(6400);list.add(bo1);bo1 = new ProductBO();bo1.setId("2001");bo1.setTitle("格力(GREE) 大1匹 变频 Qbo 壁挂式冷暖空调 KFR-26GW/(26596)FNAa-A3");bo1.setMajor_s("家用电器");bo1.setSubMajor_s("空调");bo1.setBrand_s("格力");bo1.setModel_s("KFR-26GW/(26596)FNAa-A3");bo1.setPrice_i(7700);list.add(bo1);bo1 = new ProductBO();bo1.setId("2002");bo1.setTitle("奥克斯(AUX) 正1.5匹 冷暖 定速 隐藏式显示屏 壁挂式 空调 KFR-35GW/HFJ+3");bo1.setMajor_s("家用电器");bo1.setSubMajor_s("空调");bo1.setBrand_s("奥克斯");bo1.setModel_s("KFR-35GW/HFJ+3");bo1.setPrice_i(6600);list.add(bo1);bo1 = new ProductBO();bo1.setId("2003");bo1.setTitle("海尔(HAIER) 1.5匹 变频 静音空调 冷暖 壁挂式空调 KFR-35GW/01JDA23A");bo1.setMajor_s("家用电器");bo1.setSubMajor_s("空调");bo1.setBrand_s("海尔");bo1.setModel_s("KFR-35GW/01JDA23A");bo1.setPrice_i(9600);list.add(bo1);try {server.addBeans(list);server.commit();} catch (SolrServerException | IOException e) {e.printStackTrace();}}

package morelikethis;
import java.io.Serializable;
import org.apache.solr.client.solrj.beans.Field;
public class ProductBO implements Serializable{private static final long serialVersionUID = 1L;@Fieldprivate String id;@Fieldprivate String title;@Fieldprivate String major_s;@Fieldprivate String subMajor_s;@Fieldprivate String brand_s;@Fieldprivate int price_i;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getMajor_s() {return major_s;}public void setMajor_s(String major_s) {this.major_s = major_s;}public String getSubMajor_s() {return subMajor_s;}public void setSubMajor_s(String subMajor_s) {this.subMajor_s = subMajor_s;}public String getBrand_s() {return brand_s;}public void setBrand_s(String brand_s) {this.brand_s = brand_s;}public int getPrice_i() {return price_i;}public void setPrice_i(int price_i) {this.price_i = price_i;}
}

package morelikethis;
import java.util.ArrayList;
import java.util.List;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
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 solr.solrServer;
public class SolrMlt {@SuppressWarnings("unchecked")public static void search(){HttpSolrClient server = solrServer.getServer();SolrQuery query = new SolrQuery();List<ProductBO> articles = new ArrayList<ProductBO>();query.setQuery("id:1001").setParam("fl", "id,title,brand_s")//返回的字段.setParam("mlt", "true")//打开组建.setParam("mlt.fl", "title")//用于判断相似的字段.setParam("mlt.mindf", "1")//过滤文档数小于1的文档集合.setParam("mlt.mintf","1")//过滤单个文档中关键字小于1的文档.setParam("mlt.count", "10");QueryResponse queryResponse;try {queryResponse = server.query(query);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 id = doc.getFieldValue("id").toString();if(id.equals("1001")){continue;//排除自身
                    }System.out.println(doc.getFieldValue("title").toString());}}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {search();}
}

转载于:https://www.cnblogs.com/itliucheng/p/6898727.html

11.solr学习速成之MoreLikeThis相关推荐

  1. 20145231 《信息安全系统设计基础》第11周学习总结

    20145231<信息安全系统设计基础>第11周学习总结 教材学习内容总结 异常 异常是异常控制流的一种形式,由硬件和操作系统实现.简单来说,就是控制流中的突变. 出现异常的处理方式: 1 ...

  2. 20175310 《Java程序设计》第11周学习总结

    20175310 <Java程序设计>第11周学习总结 教材学习内容总结 学习中的问题和解决过程 问题1:在做简易计算器时,测试乘法出错,如下图,显示格式错误: 问题1解决方案: 检查代码 ...

  3. 2017-2018-1 20155330 《信息安全系统设计基础》第11周学习总结

    2017-2018-1 20155330 <信息安全系统设计基础>第11周学习总结 教材学习内容总结 物理和虚拟寻址 计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组.每字 ...

  4. 20145313张雪纯《信息安全系统设计基础》第11周学习总结

    20145313张雪纯<信息安全系统设计基础>第11周学习总结 教材 异常控制流(ECF) 最简单的"平滑序列"类型的控制流是指PC中相邻的指令在存储器中也相邻.而异常 ...

  5. 学号20145209《信息安全系统设计基础》第11周学习总结

    学号20145209<信息安全系统设计基础>第11周学习总结 教材学习内容总结 教材学习内容总结 第八章 异常控制流 1.从给处理器加电开始,直到断点为止,程序计数器假设一个值的序列 a0 ...

  6. 201521123014 《Java程序设计》第11周学习总结

    201521123014 <Java程序设计>第11周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 Q1 互斥访问与同步访 ...

  7. C++11/14学习(二)类型推导

    C++11/14学习(二)类型推导 C++11 引入了 auto 和 decltype 这两个关键字实现了类型推导,让编译器来操心变量的类型. 这使得 C++ 也具有了和其他现代编程语言一样,某种意义 ...

  8. Linux-0.11内核学习-添加系统调用

    1.参考资料 赵炯博士的网站oldlinux Linux内核完全注释 Linux0.11 源码 2.概要 操作系统作为软件应用层和底层硬件之间的部分,向下提供服务,向上提供接口.系统调用便是操作系统向 ...

  9. HALCON 21.11:学习笔记---OPC_UA(I/O)

    HALCON 21.11:学习笔记---OPC_UA(I/O) 本章主要提供有关OPC_UA的信息. 系统要求 Intel compatible PC with Windows 7 (32-bit o ...

最新文章

  1. 代码覆盖率原理分析:sys.settrace流程分析
  2. SAP PM IW33里查看维护订单相关的维护计划
  3. cdoj916-方老师的分身 III 【拓扑排序】
  4. 高效的沟通方式-会议
  5. .NET开源工作流驰ccflow从表数据数据源导入设置
  6. 用 Python脚本生成 Android SALT 扰码
  7. 改变eclipse工程中代码的层次结构
  8. SAP 移动类型详解
  9. hide subscribers is a good approach if you have a very limited subscribers
  10. python学习day2:类与对象
  11. 专题导读:空天大数据
  12. TensorFlow 教程 --教程--2.4MNIST 进阶
  13. Xpath string()提取多个子节点中的文本
  14. vue.js 模板语法
  15. Sphinx API文档例子
  16. iOS中 H5的input输入框focus()无法自动拉起键盘(解决方法)
  17. 三角网格上高斯曲率和平均曲率
  18. C#大作业-通讯录管理系统
  19. html调用js里面的函数,html如何调用js函数
  20. 怎样在电脑桌面上设置员工生日提醒 每年准时提醒生日的便签

热门文章

  1. 写代码用什么笔记本_1—2千预算,编程、写代码、办公、PS修图笔记本推荐/选购指南...
  2. ubuntu 文件及子文件夹的权限的查看及修改
  3. 概述--Nginx集成Vcenter 6.X HTML Console系列之 1--(共4)
  4. 基本数据结构之Sort
  5. Android Studio 1.1.0汉化初步出炉!
  6. 上海交通大学2002年数学分析考研试题
  7. C# 关于yield return的研究(转载)
  8. Visual Studio 2010修改授权
  9. Team Foundation 和 Visual SourceSafe 之间的区别
  10. LeetCode7. 整数反转