通过JNI使用C ++尖叫快速进行Lucene搜索

一天结束时,Lucene执行查询时,在初始设置后,真正的热点通常是相当基本的代码,它解码整数docID,术语频率和位置的顺序块,并对其进行匹配(例如,对BooleanQuery并集或交集),则为每个匹配项计算得分,并在收集过程中保存具有竞争力的匹配项。 甚至显然复杂的查询(如FuzzyQueryWildcardQuery FuzzyQuery经过重写过程,从而将其简化为更简单的形式(如BooleanQuery 。 Lucene的热点非常简单,以至于无法通过将它们移植到本地C ++(通过JNI)来对其进行优化!

因此,我这样做了,创建了lucene-c-boost github项目,其结果是令人兴奋的:

任务 QPS基础 StdDev基地 QPS选择 选择标准 变化百分比
高低 469.2 (0.9%) 316.0 (0.7%) 0.7 X
模糊1 63.0 (3.3%) 62.9 (2.0%) 1.0 X
模糊2 25.8 (3.1%) 37.9 (2.3%) 1.5倍
和高级 50.4 (0.7%) 110.0 (0.9%) 2.2倍
或高低 46.8 (5.6%) 106.3 (1.3%) 2.3 X
低端 298.6 (1.8%) 691.4 (3.4%) 2.3 X
或HighNotMed 34.0 (5.3%) 89.2 (1.3%) 2.6倍
或高不高 5.0 (5.7%) 14.2 (0.8%) 2.8倍
通配符 17.2 (1.2%) 51.1 (9.5%) 3.0 X
高高 21.9 (1.0%) 69.0 (1.0%) 3.5 X
或高级 18.7 (5.7%) 59.6 (1.1%) 3.2倍
或高高 6.7 (5.7%) 21.5 (0.9%) 3.2倍
或高低 15.7 (5.9%) 50.8 (1.2%) 3.2倍
医学术语 69.8 (4.2%) 243.0 (2.2%) 3.5 X
高或低 13.3 (5.7%) 46.7 (1.4%) 3.5 X
还是不高 26.7 (5.8%) 115.8 (2.8%) 4.3 X
高端 22.4 (4.2%) 109.2 (1.4%) 4.9倍
前缀3 10.1 (1.1%) 55.5 (3.7%) 5.5倍
高低 62.9 (5.5%) 351.7 (9.3%) 5.6倍
内部NRQ 5.0 (1.4%) 38.7 (2.1%) 7.8倍

这些结果显示在完整的,多细分的Wikipedia英语索引中,包含33.3 M个文档。 除了令人惊讶的加速效果外,还很高兴看到优化的C ++版本的方差(StdDev列)通常较低,因为(大部分)热点已被排除在等式之外。

该API易于使用,并且可与默认编解码器一起使用,因此您无需尝试重​​新编制索引即可:代替IndexSearcher.search ,请调用NativeSearch.search 。 如果查询可以优化,它将被优化; 否则,它将无缝地回IndexSearcher.search 。 它与Lucene完全分离,并与现有的Lucene 4.3.0 JAR一起使用,使用Java的反射API来获取必要的位。

这都是非常新的代码,我敢肯定有很多令人兴奋的错误,但是(在进行一些有趣的调试之后!)使用NativeSearch.search时,所有Lucene核心测试现在都可以通过。

这不是Lucene的C ++端口

此代码绝对不是Lucene的常规C ++端口。 相反,它实现了一组非常狭窄的类,特别是常见的查询类型。 这些实现不是通用的:它们硬编码(专门化)特定代码,删除所有抽象,例如ScorerDocsEnumCollectorDocValuesProducer等。

在何时应用优化存在一些主要限制:

  • 到目前为止仅在Linux和Intel CPU上进行了测试
  • 需要Lucene 4.3.x
  • 必须将NativeMMapDirectory用作Directory实现,该实现将整个文件映射到RAM(避免基于Java的MMapDirectory必须执行的分块)
  • 必须使用默认编解码器
  • 仅支持按分数排序
  • 没有一个优化的实现使用advance :首先,这段代码相当复杂,要移植到C ++会花费很多工作;其次,受益于先进的查询通常已经非常快了,因此我们最好将它们留在Java中

BooleanQuery是经过优化的,但是仅当所有子句都是针对同一字段的TermQuery

C ++不比Java快!

无论如何,不​​一定如此:在有人大声疾呼这些结果如何“证明” Java比C ++慢得多之前,请记住,这远非“纯粹的” C ++ vs Java测试。 至少有以下三个单独的更改混合在一起:

  • 算法上的变化。 例如, lucene-c-boost有时使用BooleanScorer ,其中Lucene使用BooleanScorer2 。 确实,我们需要修复Lucene来进行类似的算法更改(当它们更快时)。 特别是,在上述结果中包括Not子句以及IntNRQ所有OrXX查询都将从算法更改中受益。
  • 代码专业化: lucene-c-boost将搜索作为大型的可怕外观函数来实现,从而删除了所有不错的Lucene抽象。 尽管在Lucene中显然需要抽象,但是不幸的是,它们增加了运行时的开销,因此删除这些抽象会带来一些好处。
  • C ++与Java

目前尚不清楚到底是哪个部分带来了多少收益。 实际上,我需要创建“匹配的”专用Java源代码来进行更纯净的测试。

此代码很危险!

具体来说,只要将本地C ++代码嵌入Java中,我们就有Java开发人员认为我们抛弃的C ++所有有趣的问题。 例如,如果存在错误(可能是!),或者甚至是应用程序滥用了无辜的API,例如在其他线程仍在使用IndexReader时意外关闭了IndexReader ,则该过程将遇到Segmentation Fault ,并且OS将破坏JVM。 。 可能还有内存泄漏! 而且,是的,C ++源代码甚至使用goto语句 。

工作正在进行中…

这是一项正在进行的工作,仍然有许多想法需要探索。 例如,Lucene的4.3.x版的默认PostingsFormat店大端多头,这意味着小端的Intel CPU必须做字节交换的每个帖子块进行解码时,这么一件事是尝试一个PostingsFormat在搜索时CPU更好地优化。 位置查询,过滤器和嵌套BooleanQuery以及某些配置(例如,省略规范的字段)尚未进行优化。 欢迎补丁!

尽管如此,初步结果还是很有希望的,如果您愿意冒险冒险以换取大幅度提速,请稍作调整并报告。

参考:来自我们的JCG合作伙伴 Michael Mc Candless的JNI使用 CNI 通过 CNI进行了快速Lucene搜索 ,该博客来自Changeing Bits博客。

翻译自: https://www.javacodegeeks.com/2013/06/screaming-fast-lucene-searches-using-c-via-jni.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“我们应当怎样做需求分析”——大纲卷

这是一篇关于怎么进行软件需求分析的文章,读完的第一个感觉就是累。真的是特别累,我大概估计了一下,得有40000个字。不过读完之后还是有一点收获的。下面是一个大概的内容。 一.需求调研阶段 初识1.在客户组织的第一场见面会上,保…

动态语言

这是动态语言和静态语言(例如Java)最大的差别之一。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用。 %d:输入输出中的格式控制,以整数的形式输入输出.%f:输入输出中的格式控制,以小数…

innodb和my查询速度_吃透MySQL:MyISAM和InnoDB存储引擎详细介绍

一,MySQL基本架构MySQL基础架构可以分为两大类:Server层和存储引擎层。Server层: Server层涵盖了MySQL大部分核心业务功能,并且所有存储引擎的功能都在这一层实现。存储引擎层:存储引擎有很多,各自有着各自…

Java EE EJB拦截器教程和示例

在此示例中,我们将看到如何在EJB中使用拦截器并使用简单的Web应用程序对其进行测试。 1.简介 顾名思义,当您想拦截对EJB方法的调用时,将使用拦截器。 如果为Bean声明一个拦截器,则每次调用该Bean的方法时,该拦截器的一…

HTML5结合ajax实现文件上传以及进度显示

基于原生html5实现,不需要falsh支持,进度可以自定义显示,控制灵活, 本来打算使用jquery插件进行异步文件上传,比如uploadfy但是需要额外的支持,也有人用iframe模仿异步上传机制,感觉都比较别扭。…

Mac python Tesseract 验证码识别

Tesseract 简介 Tesseract(/tesərkt/) 这个词的意思是"超立方体",指的是几何学里的四维标准方体,又称"正八胞体"。不过这里要讲的,是一款以其命名的开源 OCR(Optical Character Recognition, 光学字符识别) 软件。 所谓…

构建器模式:适用于代码,适用于测试

我发现生成器设计模式偶尔在代码中有用,但在测试中经常有用。 本文简要概述了该模式,然后介绍了在测试中使用该模式的一个有效示例。 请参阅github中的代码。 生成器模式的背景 根据GoF的书 ,构建器设计模式用于“将复杂对象的构造与其表示分…

如何判断html页面停止滚动?

写在开始的话 查遍的文献,没有找到js或者jquery定义好的方法可用,最后迫不得已自己写了个方法。(如果哪位同学知道有其他方法,欢迎讨论) 代码 var count_index 0;$(window).scroll(function(e) {if(count_index 0) {…

HTML5教程之-文件拖拽功能实现

现在打开优酷的网站我们再观看视频时如果拖动滚动条,页面会自动出现一个小的播放窗口,而这个播放窗口是可以说随便拖拽的。这种对图片或者链接的拖拽效果是怎么实现的?其实用HTML5就很容易实现了,因为HTML5中有个html5中默认对图片…

php 打乱数组顺序_PHP实现大转盘抽奖算法

php中文网最新课程每日17点准时技术干货分享本文通过具体的实例向大家介绍了PHP语言实现大转盘抽奖算法,希望对大家学习PHP抽奖有所帮助。流程:1.拼装奖项数组;2.计算概率;3.返回中奖情况。代码如下:中奖概率 v 可以…

linux线程基础篇----线程同步与互斥

linux线程基础----线程同步与互斥 一、同步的概念 1.同步概念 所谓同步,即同时起步,协调一致。不同的对象,对“同步”的理解方式略有不同。如,设备同步,是指在两个设备 之间规定一个共同的时间参考;数据库同…

分布式系统开发注意事项

开发分布式软件系统时,要考虑许多因素。 如果您甚至不知道第一句话中我在说什么,那么让我为您提供一些见解,示例以及有关分布式系统的实例。 总览 分布式系统是指多个物理硬件设备与单独的离散用户交互并通过这些硬件设备协作以为这些离散的…

只需5步,轻松创建HTML5离线应用

1 – 添加 HTML5 doctype第一件要做的事情是创建一个符合规范的 HTML5 文档。HTML5 doctype 相比于 xhtml 版本的 doctype 而言&#xff0c;要简单明了得多&#xff1a; <!DOCTYPE html><html> ...创建一个名为 index.html 的文档&#xff0c;或者猛击这里下载这份…

软工读书笔记 week 1

这次读书笔记主要是就《程序员修炼之道》这本书的前半部分做一些总结以及发表一些自己的看法。 本书前面的一部分主要是一些程序员应该在工作中时刻注意的事情&#xff0c;一些关键的信息如下&#xff1a; 1、处理问题的态度与责任。 这是在本书序言中就提到的&#xff0c;可见…

mysql脚本解读_一篇很好的关于mysqld_safe脚本源码解读的文章,收藏了!!

#!/bin/sh# 一些状态变量的定义KILL_MYSQLD1; # 试图kill多余的mysqld_safe程序&#xff0c;1表示需要killMYSQLD# mysqld二进制可执行文件的名称niceness0# 进程的调度优先级标识# 下面的变量主要用于标识不使用错误日志和sysloglogginginit # 日志记录状态&#xff0c;init代…

Java EE 7发布–反馈和新闻报道

Java EE 7已经存在了几天。 我们所有人都有机会观看直播活动或可用的重播 。 最后的MR版本完成了将他们的工作推向JCP的过程&#xff0c;基本上是一个总结。 是时候反思发生的事情以及我对此的想法了。 启动活动中的社区参与 这不是一个大秘密。 即使Oracle的Java EE 7发行可以…

进制转换器

1 /*2 进制转换器 3 P进制数x转为Q进制数z4 过程模拟&#xff0c;先转十进制再转目标进制 5 */6 #include<cstdio> 7 #include<algorithm>8 #include<stack>9 using namespace std; 10 int main(){ 11 int p,q; 12 int x,y0,z; 13 int a1; 14 …

HTML5中的本地数据库-Web SQL Database

html5增加新的特性&#xff0c;那就是增加了本地存储&#xff01;改善用户体验&#xff0c;或许html5会带着我们走进新的互联网时代。 下面看看怎样操作web 数据库吧&#xff01;&#xff01;首先新建数据库&#xff01; var db window.openDatabase("mydata", &quo…

使用Apache CXF开发SOAP Web服务

在上一篇文章中&#xff0c;我逐步介绍了使用apache CXF开发简单的RESTFull服务的步骤。 在本文中&#xff0c;我将讨论使用CXF开发SOAP Web服务。 在继续前进之前&#xff0c;让我们了解构成SOAP Web服务的一些概念/元素。 SOAP或简单对象访问协议 SOAP是一种协议&#xff0c…

pkill mysql_每天一个linux命令:kill命令

终止一个进程或终止一个正在运行的程式&#xff0c;一般是通过kill 、killall、pkill、xkill 等进行。比如一个程式已死掉&#xff0c;但又不能退出&#xff0c;这时就应该考虑应用这些工具。另外应用的场合就是在服务器管理中&#xff0c;在不涉及数据库服务器程式的父进程的停…