一天结束时,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

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

  1. vc++调用jni_通过JNI使用C ++尖叫快速进行Lucene搜索

    vc++调用jni 最终,当Lucene执行查询时,在初始设置后,真正的热点通常是相当基本的代码,该代码对整数docID,术语频率和位置的顺序块进行解码,并将它们匹配(例如,对BooleanQuery ...

  2. 使用 Apache Lucene 搜索文本——轻松为应用程序构建搜索和索引功能

    简介: 本文将探讨 Apache Lucene -- 性能卓越.功能全面的文本搜索引擎库.我们将学习 Lucene 架构及其核心 API.学习如何使用 Lucene 进行跨平台全文本搜索.建立索引.显 ...

  3. lucene 搜索_使用Lucene的搜索服务器搜索Jira问题

    lucene 搜索 您可能还记得我的第一篇博客文章 ,该文章描述了Lucene开发人员如何使用Lucene搜索应用程序查找我们的Jira问题来食用我们自己的狗粮. 该应用程序已成为许多现代Lucene ...

  4. Lucene学习总结之七:Lucene搜索过程解析

    一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...

  5. 【Elasticsearch】使用Elasticsearch 7.8 快速搭建食谱搜索系统

    1.概述 本文参考文章:使用Elasticsearch快速搭建食谱搜索系统 并且对里面的不适合7.8版本的命令进行纠正处理. 简介: 搜索是一个网站的基础功能,一个好的搜索系统可以直接促进页面访问量的 ...

  6. 【介绍】GNES ——Pythonic的直观方式快速构建神经搜索框架

    来自腾讯AI Lab肖涵(肖涵博士,腾讯AI Lab GNES项目组负责人)大神的开源项目,非常赞: GNES Flow.GNES Flow让你通过"Pythonic"的直观方式快 ...

  7. 1.find如何快速查找、搜索文件

    文章目录 前言 一.find如何快速查找.搜索文件 二.练习 前言 一.find如何快速查找.搜索文件 二.练习 (1)在系统根目录下,查找文件类型为普通文件,属于lianhc用户的,2天以前的, 并 ...

  8. 【初码干货】使用阿里云开放搜索服务快速搭建资源搜索网站

    大家好,我又来了,答应云栖论坛一周一篇文章, 由于工作太忙已中断1个多月实在抱歉,这一次写点轻松有趣的东西-快速的做个资源搜索站 依稀记得十来年前,带宽还只有2M的时候,受各个论坛启发,做了可以搜索嘿 ...

  9. 超快速的桌面搜索工具 - EveryThing绿色汉化版

    超快速的桌面搜索工具 - EveryThing绿色汉化版 是一款速度超级快的NTFS文件搜索 工具 ,能索引和搜索NTFS分区的 文件.可以按文件名进行高速搜索文件.支持远程搜索其他计算机上的文件. ...

最新文章

  1. 09_Java面向对象_第9天(类、封装)_讲义
  2. spring boot 2.0 源码分析(二)
  3. 能挣钱的,开源SpringBoot和Vue的企业级项目,代码很规范!
  4. 多类感知器算法题目_先进算法讲解
  5. oracle更改字段名顺序的方法
  6. Luogu-P4768 (Kruskal重构树+最短路)
  7. vue create()获取ref_vue-next+typescript 初体验
  8. java 遍历属性文件路径_Java项目中读取properties文件,以及六种获取路径的方法...
  9. IOT---(4)物联网平台架构设计
  10. c#:winform中多线程的使用
  11. c语言中的scanf在java中应该怎么表达,Scanner类。
  12. android壁纸路径/目录
  13. gbase里的分布表与复制表
  14. MES系统最全介绍来了
  15. 左程云算法 哈希函数
  16. 续:~英语 1038个词根 217个后缀!
  17. python我的世界给予物品指令_我的世界指令:强大的 /give 指令
  18. 一、第十五届全国大学生智能汽车竞赛AI电磁——项目介绍
  19. TCP/IP 主要报文头格式
  20. 关于object对象转换为int类型

热门文章

  1. Linux ss命令 报错,ECS Linux中ss命令显示连接状态的使用说明
  2. String path = request.getContextPath()和String basePath = request.getScheme()
  3. 纯干货,Spring-data-jpa详解,全方位介绍。
  4. spring使用自定义注解_用Spring组成自定义注释
  5. java cxf_拥抱模块化Java平台:Java 10上的Apache CXF
  6. javaone_代理的JavaOne 2016观察
  7. ios 静音模式_静音设计模式
  8. hibernate与jpa_将JPA Hibernate与OptaPlanner集成
  9. hazelcast入门教程_Hazelcast入门指南第3部分
  10. openshift_在WildFly和OpenShift上的WebSocket聊天