- 浏览: 2147400 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
对于用惯数据库的我们,多表进行join连接,是非常常见的一个需求,但是在我们的索引中,对join的支持,却不是很完美,当然这并不是由于我们的Lucene或Solr不够强大,而是全文检索与数据库的定位不是在同一个目标上,全文检索,主要定位在搜索引擎上,通常是对一个大的索引进行高效检索,而数据库则是定位在结构化数据的存储于与检索,检索功能比较薄弱,那我们的索引是不是就不支持join了,实事并非如此,Lucene里面支持join操作,这种join定位在同一份索引里,而Solr作为Lucene的扩展,又提供了两core join的功能,下面散仙给出一个例子,尽量简单,清晰的描述出如何使用它们和理解它们的工作方式。
散仙,有2个core,分别是collection1,和collection2,里面的数据分别是:
collection1:总共有3条数据
collection1:schema 都是字符串string ; 有id,name两个字段 ;
collection1: {1, Apple}, {2, Samsung}, {3, HTC}
collection2:总共有5条数据
collection2:schema 都是字符串string ;有id,name,brand_id 两个字段;
collection2: {1, iPhone, 1}, {2, iPad, 1}, {3, Galaxy S3, 2}, {4, Galaxy Note, 2}, {5, One X, 3}
下面,先来看下单core的join,以collection2作为例子,测试代码如下:
运行结果如下:
改变,条件后,再测:
运行结果如下:
分析运行原理,类似sql中的写法:
SELECT *
FROM collection1
WHERE brand_id IN (SELECT id FROM collection1 where brand_id = * )
第一步,先执行子查询SELECT id FROM collection1 where brand_id = *
会返回所有的id分别是,1,2,3,4,5
第二步,执行主查询就是
SELECT *
FROM collection1
WHERE brand_id in (1,2,3,4,5)
而brand_id去重完之后,就只有1,2,3了,所以转换成如下查询:
SELECT *
FROM collection1
WHERE brand_id(1,2,3) in (1,2,3,4,5)
取并集后结果,就会命中brand_id=1,2,3的文档,所以就命中了所有的文档
再来分析下,第二个查询,指定查询id的join:
第一步,先执行子查询SELECT id FROM collection1 where brand_id = 2
会返回所有的id分别是,3,4,
第二步,执行主查询就是
SELECT *
FROM collection1
WHERE brand_id in (3,4)
而brand_id去重完之后,就只有1,2,3了,所以转换成如下查询:
SELECT *
FROM collection1
WHERE brand_id(1,2,3) in brand_id(3,4)
取并集后的结果,就会命中brand_id=3的文档了,所以就会返回ID为5的文档;
下面,来测下,两个core的join,代码如下:
结果如下:
分析类似如下SQL:
SELECT b.* FROM collection1 b
INNER JOIN collection2 p ON b.id=p.brand_id
WHERE p.name="iPad";
注意collection名的先后顺序,如上solrj里面的执行,跟上面的sql的运行规则是一样的,所以我们最终的结果里,会返回,如果我们的条件是下面的相反组合:
则运行结果如下所示:
原理,依旧与如上的sql一样。只不过位置相反,调整了:
SELECT b.* FROM collection2 b
INNER JOIN collection1 p ON b.id=p.brand_id
WHERE b.id=1;
散仙,有2个core,分别是collection1,和collection2,里面的数据分别是:
collection1:总共有3条数据
collection1:schema 都是字符串string ; 有id,name两个字段 ;
collection1: {1, Apple}, {2, Samsung}, {3, HTC}
collection2:总共有5条数据
collection2:schema 都是字符串string ;有id,name,brand_id 两个字段;
collection2: {1, iPhone, 1}, {2, iPad, 1}, {3, Galaxy S3, 2}, {4, Galaxy Note, 2}, {5, One X, 3}
下面,先来看下单core的join,以collection2作为例子,测试代码如下:
/*** * join测试 * * * ***/ public static void joinquery2()throws Exception{ SolrServer server1=new HttpSolrServer("http://localhost:9003/solr/collection2"); SolrQuery sq=new SolrQuery(); //sq.set("fl", "id,name");//过滤只需要返回的字段 sq.set("q", "{!join from=id to=brand_id }brand_id:*"); QueryResponse qr=server1.query(sq, METHOD.POST); SolrDocumentList list=qr.getResults(); System.out.println("命中结果集:"+qr.getResults().size()); for(SolrDocument s:list){ System.out.println(s.toString()); } }
运行结果如下:
五月 14, 2014 9:03:58 下午 org.apache.solr.client.solrj.impl.HttpClientUtil createClient INFO: Creating new http client, config:maxConnections=128&maxConnectionsPerHost=32&followRedirects=false 命中结果集:5 SolrDocument{id=1, name=iPhone, brand_id=1, _version_=1468079557386960896} SolrDocument{id=2, name=iPad, brand_id=1, _version_=1468079557408980992} SolrDocument{id=3, name=Galaxy, brand_id=2, _version_=1468079557412126720} SolrDocument{id=4, name=Galaxy Note, brand_id=2, _version_=1468079557416321024} SolrDocument{id=5, name=One X, brand_id=3, _version_=1468079557420515328}
改变,条件后,再测:
/*** * join测试 * * * ***/ public static void joinquery2()throws Exception{ SolrServer server1=new HttpSolrServer("http://localhost:9003/solr/collection2"); SolrQuery sq=new SolrQuery(); //sq.set("fl", "id,name");//过滤只需要返回的字段 sq.set("q", "{!join from=id to=brand_id }brand_id:2"); QueryResponse qr=server1.query(sq, METHOD.POST); SolrDocumentList list=qr.getResults(); System.out.println("命中结果集:"+qr.getResults().size()); for(SolrDocument s:list){ System.out.println(s.toString()); } }
运行结果如下:
五月 14, 2014 9:10:04 下午 org.apache.solr.client.solrj.impl.HttpClientUtil createClient INFO: Creating new http client, config:maxConnections=128&maxConnectionsPerHost=32&followRedirects=false 命中结果集:1 SolrDocument{id=5, name=One X, brand_id=3, _version_=1468079557420515328}
分析运行原理,类似sql中的写法:
SELECT *
FROM collection1
WHERE brand_id IN (SELECT id FROM collection1 where brand_id = * )
第一步,先执行子查询SELECT id FROM collection1 where brand_id = *
会返回所有的id分别是,1,2,3,4,5
第二步,执行主查询就是
SELECT *
FROM collection1
WHERE brand_id in (1,2,3,4,5)
而brand_id去重完之后,就只有1,2,3了,所以转换成如下查询:
SELECT *
FROM collection1
WHERE brand_id(1,2,3) in (1,2,3,4,5)
取并集后结果,就会命中brand_id=1,2,3的文档,所以就命中了所有的文档
再来分析下,第二个查询,指定查询id的join:
第一步,先执行子查询SELECT id FROM collection1 where brand_id = 2
会返回所有的id分别是,3,4,
第二步,执行主查询就是
SELECT *
FROM collection1
WHERE brand_id in (3,4)
而brand_id去重完之后,就只有1,2,3了,所以转换成如下查询:
SELECT *
FROM collection1
WHERE brand_id(1,2,3) in brand_id(3,4)
取并集后的结果,就会命中brand_id=3的文档了,所以就会返回ID为5的文档;
下面,来测下,两个core的join,代码如下:
/*** * join测试 * * * ***/ public static void joinquery2()throws Exception{ SolrServer server1=new HttpSolrServer("http://localhost:9003/solr/collection1"); SolrQuery sq=new SolrQuery(); //sq.set("fl", "id,name");//过滤只需要返回的字段 sq.set("q", "{!join from=brand_id to=id fromIndex=collection2}name:iPad"); QueryResponse qr=server1.query(sq, METHOD.POST); SolrDocumentList list=qr.getResults(); System.out.println("命中结果集:"+qr.getResults().size()); for(SolrDocument s:list){ System.out.println(s.toString()); } }
结果如下:
五月 14, 2014 9:30:41 下午 org.apache.solr.client.solrj.impl.HttpClientUtil createClient INFO: Creating new http client, config:maxConnections=128&maxConnectionsPerHost=32&followRedirects=false 命中结果集:1 SolrDocument{id=1, name=Apple, _version_=1468079556974870528}
分析类似如下SQL:
SELECT b.* FROM collection1 b
INNER JOIN collection2 p ON b.id=p.brand_id
WHERE p.name="iPad";
注意collection名的先后顺序,如上solrj里面的执行,跟上面的sql的运行规则是一样的,所以我们最终的结果里,会返回,如果我们的条件是下面的相反组合:
public static void joinquery()throws Exception{ SolrServer server1=new HttpSolrServer("http://localhost:9003/solr/collection2"); SolrQuery sq=new SolrQuery(); sq.set("q", "{!join from=id to=brand_id fromIndex=collection1}id:1"); QueryResponse qr=server1.query(sq, METHOD.POST); SolrDocumentList list=qr.getResults(); System.out.println("命中结果集:"+qr.getResults().size()); for(SolrDocument s:list){ //s.toString(); System.out.println(s.toString()); }
则运行结果如下所示:
五月 14, 2014 9:43:46 下午 org.apache.solr.client.solrj.impl.HttpClientUtil createClient INFO: Creating new http client, config:maxConnections=128&maxConnectionsPerHost=32&followRedirects=false 命中结果集:2 SolrDocument{id=1, name=iPhone, brand_id=1, _version_=1468079557386960896} SolrDocument{id=2, name=iPad, brand_id=1, _version_=1468079557408980992}
原理,依旧与如上的sql一样。只不过位置相反,调整了:
SELECT b.* FROM collection2 b
INNER JOIN collection1 p ON b.id=p.brand_id
WHERE b.id=1;
发表评论
-
最新版Solr6.2.1安装记录
2016-09-23 18:48 1980下载最新版Solr6.2.1 wget http:/ ... -
ElasticSearch+Solr几个案例笔记
2016-09-22 18:46 1897(一) 最大能索引字符 ... -
SolrCloud之Sharding路由介绍
2016-07-19 16:07 3371在Solr4.4之后,Solr提供了SolrCloud ... -
SolrCloud6.1.0之SQL查询测试
2016-07-12 11:21 2327Solr发展飞快,现在最 ... -
Lucene/Solr/ElasticSearch搜索问题案例分析
2016-06-23 18:08 1801最近收集的两个搜索 ... -
Lucene+Solr+ElasticSearch查询匹配优化
2016-06-01 19:37 2873当我们在处理搜索业务时候,需求往往是灵活多变的,有时候我们需 ... -
如何通过JMX远程监控Solr?
2016-05-23 16:07 1971有时候,我们在服务 ... -
如何实现Solr自定义评分查询
2016-05-12 17:49 4783(一)背景介绍 大多数时候我们使用lucene/solr ... -
浅谈Lucene中的DocValues
2016-05-10 19:12 7403前言: 在Lucene4.x之后, ... -
开源大数据索引项目hive-solr
2016-05-06 16:15 1899github地址:https://github.com/qi ... -
浅谈Solr和ElasticSearch建索引性能优化策略
2016-04-27 18:48 2159由于Solr和ElasticSearch ... -
如何使用Hive集成Solr?
2016-03-17 15:05 2779(一)Hive+Solr简介 Hive ... -
Solr中如何使用游标进行深度分页查询
2016-03-10 16:34 3750通常,我们的应用系统 ... -
Hbase+Solr实现二级索引提供高效查询
2016-02-18 18:28 7014接着上一篇介绍协处理 ... -
SolrCloud5.4.1集群实战(一)
2016-02-06 10:06 3815古时候,人们用一头牛 ... -
如何使用Spark大规模并行构建索引
2016-02-01 12:54 2661使用Spark构建索引非常简单,因为spark提供了更高级的 ... -
如何在Solr中实现多core查询?
2015-12-07 20:55 4055基于solr或者elasticsearch提供的多核,多索引 ... -
Solr配置maxBooleanClauses属性不生效原因分析
2015-12-02 14:12 2425上次已经写过一篇关于 ... -
Solr如何避免查询条件过多异常
2015-11-17 16:07 2841今天,需要查询一个东西,在q里面大概有900左右参数,使用so ... -
Solr中Group和Facet的用法
2015-10-14 19:40 4530先来看一下Group与Facet的 ...
相关推荐
NULL 博文链接:https://mozhenghua.iteye.com/blog/2275318
solr定时索引使用到的定时调度器jar包, 可使用于solr7.x版本
solr安装和使用
lucene,solr的使用lucene,solr的使用lucene,solr的使用lucene,solr的使用lucene,solr的使用lucene,solr的使用lucene,solr的使用lucene,solr的使用lucene,solr的使用lucene,solr的使用lucene,solr的使用
Solr(Cloudera)使用手册
solr.warsolr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包...
视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,...2. Solr Join查询 3. 相关度排序 4.Solr缓存 5.Spring Data Solr 章节五:综合案例,电商网站搜索页面 1.关键字搜索 2.搜索面板展示 3.分页 4.排序 5.高亮
centos7 环境 安装docker 并在docker 中部署solr 并使用
solr的安装使用步骤
如何使用solr搭建服务器
使用Solr为大数据库搭建搜索引擎,内容很好的,不忽悠
solr
适用于Java后台开发Solr搜索服务使用者,包括Java使用Solr服务、Solr服务器的搭建,以及Solr服务器集群的搭建
solr使用和原理 简单明了的介绍了solr的使用和原理,及其部署方式,适合初学者第一次部署
solr
使用Solr内置的Jetty服务器启动Solr (1)借助X Shell上传solr的安装包到/usr/local/目录下,使用 tar -zxvf命令进行解压. (2)使用内置的Jetty来启动Solr服务器只需要在example目录下,执行start.jar程序即可,...
用于solr6.5的IK分词包,内含使用说明及配置文件
solr文档
1.2.1 Solr使用Lucene并且进行了扩展 4 1.2.2 Schema(模式) 5 1.2.3 查询 5 1.2.4 核心 5 1.2.5 缓存 5 1.2.6 复制 6 1.2.7 管理接口 6 1.3 Solr服务原理 6 1.3.1 索引 6 1.3.2 搜索 7 1.4 源码结构 8 1.4.1 目录...
solr 安装教程