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;
@Field
private String id;
@Field
private String title;
@Field
private String major_s;
@Field
private String subMajor_s;
@Field
private String brand_s;
@Field
private 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();
}
}

11.solr学习速成之MoreLikeThis的更多相关文章

  1. 1.solr学习速成之配置文件

    什么是solr Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过H ...

  2. 2.solr学习速成之安装

    1.下载解压solr-5.3.1.tgz [root@205 opt]# tar -zxf solr-5.3.1.tgz -C /opt/module/ 2.将solr-5.3.1/server/so ...

  3. 13.solr学习速成之IK分词器

    IKAnalyzer简介 IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包. IKAnalyzer特性 a. 算法采用“正向迭代最细粒度切分算法”,支持细粒度和最大词长两 ...

  4. 12.solr学习速成之dataimport

    solr除了利用solrj建立索引外,还可以由列式数据库hbase触发器添加索引,自动全量或者增量索引关系数据库数据等. dataimport可以配置从任何关系数据库导入索引 1.将jar包拷贝到to ...

  5. 10.solr学习速成之高亮显示

    Solr高亮显示的三种实现 高亮显示在搜索中使用的比较多,比较常用的有三种使用方式,如果要对某field做高亮显示,必须对该field设置stored=true .          第一种是普通的高 ...

  6. 9.solr学习速成之group

    Group与Facet的区别  facet的查询结果主要是分组信息:有什么分组,每个分组包括多少记录:但是分组中有哪些数据是不可知道的,只有进一步搜索.        group则类似于关系数据库的g ...

  7. 8.solr学习速成之FacetPivot

    什么是Facet.pivot  Facet.pivot就是按照多个维度进行分组查询,是Facet的加强,在实际运用中经常用到,一个典型的例子就是商品目录树 NamedList解释: NamedList ...

  8. 7.solr学习速成之facet

    Facet 介绍   Facet 是 solr 的高级搜索功能之一 ,可以给用户提供更友好的搜索体验,在搜索关键字的同时 , 能够按照 Facet 的字段进行分组并统计.        比如你上淘宝, ...

  9. 6.solr学习速成之multicore查询

    查询关联多个core 再新建一个core 向每个core添加索引,修改 final static String SOLR_URL = "http://localhost:8080/solr/ ...

随机推荐

  1. word-break:break-all 打散文字,强制对齐

  2. 使用 $scope.$apply 手动更新页面数据

    注意 $scope.$apply  调用时的位置

  3. [GitHub] git push的时候报错 fatal: unable to access 'http://github.com/xxx/xxx.git/': Recv failure: Connection reset by peer

    参考了两种方法: 1. 解决fatal: unable to connect to github.com问题 http://blog.csdn.net/greenqingqingws/article/ ...

  4. visual studio 一些小技巧 整理

    本博客将会陆续的整理一些作者在实际开发中的一些小技巧,一些挺有意思的东西,将会持续更新, 如果有问题,可以加群讨论,QQ群:592132877 #warning的使用 #warning 的意思是在程序 ...

  5. Win10安装Ubuntu16.04 双系统

    Tips: 双系统Ubuntu可以使用机器的GPU硬件,虚拟机不可以 压缩卷留的空间尽量大一点,不要相信50G够用 选UEFI,并关闭 Secure Boot,不要选 Legacy 选UEFI,就要在 ...

  6. wampserver搭建本地服务器

    打开..\wamp\bin\apache\apache2.4.9\conf\httpd.conf配置文件, <Directory "c:/wamp/www/"> # # ...

  7. I.MX6 Linux eGTouch TouchScreen porting

    I.MX6 Linux eGTouch TouchScreen porting 一.Download Driver: http://www.eeti.com.tw/drivers_Linux.html ...

  8. git重新配置所有

    参考,防止以后忘记:https://www.jianshu.com/p/7fa6b2d81f19 git clone git://github.com/ZengsfOS/SecurityKeyBroa ...

  9. Javascrpt 速成篇】 三:js事件处理

    ie和chrome,firefox的事件处理,除了函数名字不同,基本大同小异.这样就已chrome为主了,对ie有兴趣的自己去百度.jquery已经处理不同浏览器兼容性问题,推荐使用. 事件处理有两种 ...

  10. c语言符号常量与常变量的区别?

    <blockquote>定义符号常量:#define PI 3.1415926               //注意后面没有分号 定义常变量  :const float PI=3.1415 ...