- 浏览: 2188700 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 2025下载最新版Solr6.2.1 wget http:/ ... -
ElasticSearch+Solr几个案例笔记
2016-09-22 18:46 1949(一) 最大能索引字符 ... -
SolrCloud之Sharding路由介绍
2016-07-19 16:07 3465在Solr4.4之后,Solr提供了SolrCloud ... -
SolrCloud6.1.0之SQL查询测试
2016-07-12 11:21 2389Solr发展飞快,现在最 ... -
Lucene/Solr/ElasticSearch搜索问题案例分析
2016-06-23 18:08 1853最近收集的两个搜索 ... -
Lucene+Solr+ElasticSearch查询匹配优化
2016-06-01 19:37 2962当我们在处理搜索业务时候,需求往往是灵活多变的,有时候我们需 ... -
如何通过JMX远程监控Solr?
2016-05-23 16:07 2027有时候,我们在服务 ... -
如何实现Solr自定义评分查询
2016-05-12 17:49 4869(一)背景介绍 大多数时候我们使用lucene/solr ... -
浅谈Lucene中的DocValues
2016-05-10 19:12 7602前言: 在Lucene4.x之后, ... -
开源大数据索引项目hive-solr
2016-05-06 16:15 1983github地址:https://github.com/qi ... -
浅谈Solr和ElasticSearch建索引性能优化策略
2016-04-27 18:48 2231由于Solr和ElasticSearch ... -
如何使用Hive集成Solr?
2016-03-17 15:05 2855(一)Hive+Solr简介 Hive ... -
Solr中如何使用游标进行深度分页查询
2016-03-10 16:34 3827通常,我们的应用系统 ... -
Hbase+Solr实现二级索引提供高效查询
2016-02-18 18:28 7093接着上一篇介绍协处理 ... -
SolrCloud5.4.1集群实战(一)
2016-02-06 10:06 3889古时候,人们用一头牛 ... -
如何使用Spark大规模并行构建索引
2016-02-01 12:54 2725使用Spark构建索引非常简单,因为spark提供了更高级的 ... -
如何在Solr中实现多core查询?
2015-12-07 20:55 4101基于solr或者elasticsearch提供的多核,多索引 ... -
Solr配置maxBooleanClauses属性不生效原因分析
2015-12-02 14:12 2487上次已经写过一篇关于 ... -
Solr如何避免查询条件过多异常
2015-11-17 16:07 2880今天,需要查询一个东西,在q里面大概有900左右参数,使用so ... -
Solr中Group和Facet的用法
2015-10-14 19:40 4637先来看一下Group与Facet的 ...
相关推荐
ysoserial是一个用于生成利用不安全的Java对象反序列化的有效负载的概念验证工具。它包含一系列在常见Java库中发现的"gadget chains",可以在特定条件下利用执行不安全的反序列化操作的Java应用程序。ysoserial项目最初在2015年AppSecCali会议上提出,包含针对Apache Commons Collections(3.x和4.x版本)、Spring Beans/Core(4.x版本)和Groovy(2.3.x版本)的利用链
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2530上运行,如果是其他型号芯片,请自行移植。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、例程具有一定专业性,非专业人士请谨慎操作。
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
**Oracle 10g DBA学习手册:安装Oracle和构建数据库** **目的:** 本章节旨在指导您完成Oracle数据库软件的安装和数据库的创建。您将通过Oracle Universal Installer (OUI)了解软件安装过程,并学习如何利用Database Configuration Assistant (DBCA)创建附加数据库。 **主题概览:** 1. 利用Oracle Universal Installer (OUI)安装软件 2. 利用Database Configuration Assistant (DBCA)创建数据库 **第2章:Oracle软件的安装与数据库构建** **Oracle Universal Installer (OUI)的运用:** Oracle Universal Installer (OUI)是一个图形用户界面(GUI)工具,它允许您查看、安装和卸载机器上的Oracle软件。通过OUI,您可以轻松地管理Oracle软件的安装和维护。 **安装步骤:** 以下是使用OUI安装Oracle软件并创建数据库的具体步骤:
消防验收过程服务--现场记录表.doc
数据库管理\09-10年第1学期数据库期末考试试卷A(改卷参考).doc。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
职业暴露后的处理流程.docx
Java Web开发短消息系统
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
这是一款可以配置过滤目录及过滤的文件后缀的工具,并且支持多个项目同时输出导出,并过滤指定不需要导出的目录及文件后缀。 导出后将会保留原有的路径,并在新的文件夹中体现。
Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
YOLO算法-挖掘机与火焰数据集-7735张图像带标签-挖掘机.zip
操作系统实验 Ucore lab5
IMG_5950.jpg
竞选报价评分表.docx
java系统,mysql、springboot等框架
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2530上运行,如果是其他型号芯片,请自行移植。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、例程具有一定专业性,非专业人士请谨慎操作。
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
内容概要:本文详细讲解了搜索引擎的基础原理,特别是索引机制、优化 like 前缀模糊查询的方法、建立索引的标准以及针对中文的分词处理。文章进一步深入探讨了Lucene,包括它的使用场景、特性、框架结构、Maven引入方法,尤其是Analyzer及其TokenStream的实现细节,以及自定义Analyzer的具体步骤和示例代码。 适合人群:数据库管理员、后端开发者以及希望深入了解搜索引擎底层实现的技术人员。 使用场景及目标:适用于那些需要优化数据库查询性能、实施或改进搜索引擎技术的场景。主要目标在于提高数据库的访问效率,实现高效的数据检索。 阅读建议:由于文章涉及大量的技术术语和实现细节,建议在阅读过程中对照实际开发项目,结合示例代码进行实践操作,有助于更好地理解和吸收知识点。