lucene自动补全

最简单的Apache Lucene查询TermQuery匹配包含指定术语的任何文档,无论该术语出现在每个文档中的何处 。 使用BooleanQuery可以将多个TermQuery组合在一起,并完全控制哪些术语是可选的( SHOULD )和哪些是必需的( MUST )或不应该存在( MUST_NOT ),但是匹配仍然忽略了每个术语在。文件。

有时您确实在乎术语的位置,在这种情况下,Lucene具有各种所谓的邻近查询。

最简单的邻近查询是PhraseQuery ,以匹配特定的令牌序列,例如“ Barack Obama”。 如图所示, PhraseQuery是一条简单的线性链:

默认情况下,短语必须精确匹配,但是如果您设置非零倾斜系数 ,则即使标记不完全按顺序排列,只要编辑距离在指定的倾斜范围内,文档仍然可以匹配。 例如,倾斜系数为1的“巴拉克·奥巴马”还将与包含“巴拉克·侯赛因·奥巴马”或“巴拉克·H·奥巴马”的文档匹配。 如下图所示:

现在,图中有多个路径,包括任意* )转换以匹配任意标记。 (注意:虽然图形无法正确表达它,但此查询还将匹配一个将令牌Barack和Obama放在同一位置的文档,这有点奇怪!)

通常,邻近查询在CPU和IO资源上的开销都更大,因为对于每个潜在的文档命中而言,邻近查询必须加载,解码并访问另一个维度(位置)。 也就是说,对于精确的匹配(无斜率),使用通用语法,带状疱疹和ngram来索引索引中的其他“接近项”可以在某些情况下提供巨大的性能改进,但要以增加索引大小为代价。

MultiPhraseQuery是另一个邻近查询。 它通过在每个位置允许多个令牌来概括PhraseQuery ,例如:

这与包含domain name systemdomain name service任何文档匹配。 MultiPhraseQuery还接受坡度因子,以允许进行非精确匹配。

最后,范围查询(例如SpanNearQuerySpanFirstQuery )走得更远,允许您基于每个子句匹配的位置来构建复杂的复合查询。 它们的独特之处在于您可以任意嵌套它们。 例如,您可以先构建一个与SpanNearQuery = 1的巴拉克·奥巴马(Barack Obama)匹配的SpanNearQuery ,然后再匹配一个与乔治·布什(George Bush)匹配的对象,然后再创建一个SpanNearQuery ,将这两个都作为子条款,如果它们在10个词条之内出现则匹配。

TermAutomatonQuery简介

从Lucene 4.10开始,将有一个新的邻近查询,以进一步概括MultiPhraseQuery和span查询:它使您可以直接构建一个任意自动机,表达术语必须按顺序出现的方式,包括处理斜率的任何过渡。 这是一个例子:

这是一个非常专业的查询,可让您精确控制组成匹配的令牌顺序。 您将按状态和按过渡构建自动机,包括显式添加任何过渡(对不起,尚无QueryParser支持,欢迎使用补丁!)。 一旦完成,查询将确定自动机,然后使用与诸如FuzzyQuery之类的查询用于快速术语匹配的相同基础结构(例如CompiledAutomaton ),但将其应用于术语位置而不是术语字节。 该查询像短语查询一样天真的得分,在某些情况下可能不理想。

除了此新查询之外,还有一个简单的实用程序类TokenStreamToTermAutomatonQuery ,该类可将任何图TokenStream转换为等效的TermAutomatonQuery 。 这很强大,因为它意味着即使是任意令牌流图也可以在搜索时正确表示,并保留了某些令牌化程序现在设置的PositionLengthAttribute

尽管这意味着您最终可以在查询时正确地应用任意令牌流图同义词,因为索引仍未存储PositionLengthAttribute ,索引时同义词仍不完全正确 。 这就是说,它是简单的建立一个TokenFilter写入位置长度为有效载荷,然后延长新TermAutomatonQuery从有效载荷读取和匹配过程中采用的是长度(补丁欢迎!)。

该查询可能相当慢,因为它假定每个术语都是可选的。 在许多情况下,确定所需条件(例如上例中的奥巴马)并优化此类情况将很容易。 如果查询是从令牌流派生的,因此它没有周期并且不使用任何转换,则枚举自动机接受的所有短语可能会更快(Lucene已经具有getFiniteStrings API可以对任何自动机),然后根据这些词组查询构造布尔查询。 这将匹配同一组文档,也将正确保留PositionLengthAttribute ,但是将分配不同的分数。

该代码是非常新的,肯定有一些令人兴奋的错误! 但这对于任何需要精确控制术语在文档中出现位置的应用程序来说都是一个不错的开始。

翻译自: https://www.javacodegeeks.com/2014/08/a-new-proximity-query-for-lucene-using-automatons.html

lucene自动补全

lucene自动补全_使用自动机的Lucene新的邻近查询相关推荐

  1. jupyter 代码自动补全_在 Pycharm 中安装及使用 Jupyter (图文详解)

    Pycharm 更新了对 Jupyter  的功能支持,结合 IntelliJ 的自动补全代码,自动格式化代码,执行调试,版本控制,以及大量的插件支持. 让你在高颜值环境下,高效编写代码,效果如下: ...

  2. dev c++代码自动补全_让代码自动补全的全套流程

    作者: 熊唯,黄飞 ,腾讯 PCG/QQ研发中心/CV应用研究组 AI 如果真的可以写代码了,程序员将何去何从?近几年,NLP 领域的生成式任务有明显的提升,那通过 AI 我们可以让代码自动完成后续补 ...

  3. python3 idle自动补全_给Python IDLE加上自动补全和历史功能

    许多时候,我们使用Python,并不用写一个程序,一些不复杂的任务,我更喜欢在 IDLE(也就是交互式提示模式)下输入几行代码完成.然而,在这个模式下编辑代码,也有不够便利的地方,最主要的就是,不能用 ...

  4. iterm2自动补全_【超级实用】Iterm2 + ohmyzsh 打造强大的终端编辑器

    作者:AndrewHR 地址:http://mrw.so/4D1n7B 最终的效果图如下所示:使用iterm2配合oh-my-zsh的命令行,拥有语法高亮.命令自动补全.自动提示符.显示git仓库状态 ...

  5. python tab键自动补全_设置python中TAB键自动补全方法

    设置python中TAB键自动补全方法 一.创建自动补全脚本如下: vi /tmp/python/tab.py #!/usr/bin/python # python tab file import s ...

  6. vscode python 自动补全_利用CodeBERT,这个VS Code扩展可以自动生成Python文档字符串...

    机器之心报道 编辑:魔王 该扩展利用可处理编程语言和自然语言的预训练模型 CodeBERT,实现快速生成 Python 文档字符串的功能. Visual Studio Code(简称 VS Code) ...

  7. c语言 vscode代码自动补全_借助C/C++ Extension实现VSCode C++代码补全

    在VSCode C/C++ IntelliSense领域,目前有两位实力相当的选手,它们分别是基于微软闭源技术的C/C++ Extension和开源方案clangd.根据我目前体验,它俩的特性可以总结 ...

  8. java swing 自动补全_扩展easyui的combobox组件的自动完成(autocomplete)

    update:现有有easyui插件直接提供了该功能. 可以请参考:http://www.easyui-extlib.com/ 里面combobox的根据拼音自动显示.里面各种插件造福大家. ---- ...

  9. python getopt参数参数自动补全_如何在Python中使用getopt / OPTARG?如果给出过多的参数(9),如何转移参数?...

    How to use getopt/optarg in Python? 解决方案 This is an example of how I do it, I usually use the same b ...

最新文章

  1. mysql 什么不能用别名_[转]为何group by后面不能使用别名(除MySQL)
  2. 关于明年减半——BCH将会暴涨还是暴跌?矿工如何应对?
  3. 计算机专业英文简历和求职信,计算机专业生英文求职信范文
  4. c# 经验谈:巧用Expression表达式 解决类似于sql中 select in 的查询(适合于中小型项目)...
  5. 深入分析Java Web技术内幕 修订版 pdf
  6. C# 连接SQL 连接字符串
  7. asp.net 正在加载效果实现
  8. (一)UI设计的一些常识
  9. 亲,C/C++/C#居然薄弱叻?不会吧,现在是HTML5+CSS3+javascript的时代?
  10. hdu acm2309
  11. 自媒体标题不会写?用这个工具,一键生成爆文标题
  12. c语言c99标准,C语言 1999年标准 (C99)
  13. jQuery图片LightBox插件 点击图片放大 支持移动手机
  14. JS验证邮箱格式、信用码、税号和注册号
  15. 一个Layered Window从支持多屏到高DPI开始,遭遇的性能雪崩及其优化历程
  16. 如何用手机远程控制电脑
  17. 用Python自带的tkinter制作一款简易音乐播放器(附工程文件)
  18. 微服务之RPC(远程过程调用)的四种方式
  19. C语言_函数(Function)
  20. 用Python一键生成属于自己的QQ历史报告,看看你对自己的QQ了解程度有多深?

热门文章

  1. P1169-[ZJOI2007]棋盘制作【贪心】
  2. 洛谷UVA1328,POJ1961-Period【KMP,字符串】
  3. 初一模拟赛总结(5.11)
  4. 18、数据的备份和还原
  5. art-template入门(一)之介绍
  6. Java8系列之重新认识HashMap
  7. SpringMVC @Transactional的陷井大坑引发No Session found for current thread
  8. JDK9新特性实战:简化流关闭新姿势
  9. Nodejs安装及使用
  10. 3班的第二次模拟面试