使用自动机的Lucene新的邻近查询

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

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


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

barack_obama1

默认情况下,短语必须精确匹配,但是如果您设置非零倾斜系数 ,则即使标记不完全按顺序排列,只要编辑距离在指定的倾斜范围内,文档仍然可以匹配。 例如,倾斜系数为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查询:它允许您直接构建一个任意自动机,表达术语必须按顺序出现的方式,包括处理斜率的任何过渡。 这是一个例子:

barack_obama3

这是一个非常专业的查询,可让您精确控制组成匹配的令牌顺序。 您将按状态和按过渡构建自动机,包括显式添加任何过渡(对不起,尚无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

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

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

相关文章

很口语blood-aholic

很口语blood-aholic blood-aholic 嗜血。aholic可译为:工作狂posted on 2010-10-22 22:32 Johnny_Z 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/Johnny_Z/archive/2010/10/22/1858752.html

关于HTML的面试题-html4/css2篇

1. 什么是HTML?2. 用过什么调试器(浏览器),编辑器?3. HTML4.0 和 HTML5.0 的区别?4. 手写 HTML 代码5. 元素类型有哪些(display有哪些属性)?块元素、行元素和行内块元素的…

二阶段冲刺(五)

昨天通过查询fragment,得到另一种使用方法,那就是一旦图表初始化之后就不再重新加载。但自己画的饼状图太麻烦了,我决定换一种思路。 今天我要使用github上开源的Android画图工具:MPAndroidChart。 转载于:https://www.cnblogs.co…

Java EE:异步构造和功能

介绍 Java EE具有许多API和构造以支持异步执行。 从可伸缩性和性能的角度来看,这是至关重要的。 让我们假设2个模块相互交互。 当模块A (发送方)以同步方式向模块B (接收方)发送消息时,通信将在单个线程的…

用 JA Transmenu 模块做多级弹出菜单

转自http://www.joomlagate.com “弹出菜单”这个说法本来不规范,尽管你我都明白这是什么意思,而实际上我们所理解的那个菜单样式英文说法是“Slide Menu”(滑动菜单),如果要用“弹出菜单”就成了“Popup Menu”。当然…

webpack入门 --初级压缩

1、新建一个文件夹,再初始化npm: npm init 2、安装webpack,首先要全局安装,再本地安装: npm install webpack -g // 全局安装 npm install webpack-cli -g npm install --save-dev webpack 3、建一个文件&#x…

模块和包

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里这样,每个文件包含的代码就相对较少&…

关于HTML的面试题-html5/css3篇

1. html5 新增标签有哪些(或者新增的语义标签)?2. HTML5 中有哪些新特性?3. 视频有哪几种格式?这几种格式有什么区别?4. 写出你知道的层级选择符(结构性伪类选择器)5. 什么是渐进增强…

鳞翅目动物的诅咒:玩java.time

流行测验:这个小程序的输出是什么? public class DateFun {public static void main(String[] args) {long hours getHoursOfDay(LocalDate.now(), ZoneId.systemDefault());System.out.println(hours);}private static long getHoursOfDay(LocalDate …

jq 方法函数(淡入淡出,查找元素,过滤)遍历

淡入淡出:fadeIn fadeOut fadeToggle fadeTo 淡入:fadeIn(speed[,callback]) 速度和回调函数 回调函数可以写匿名函数,或者方法名不加括号。 speed 为‘slow’或 1000 毫秒数不加引号 淡出:fadeOut …

Elasticsearch的用例:灵活的查询缓存

在前两篇有关Elasticsearch用例的文章中,我们已经看到Elasticsearch 可用于存储甚至大量文档 ,并且我们可以通过Query DSL使用Lucene的全文功能访问那些 文档 。 在这篇较短的文章中,我们将把两个用例放在一起,以了解读取繁重的应…

Vue底层架构及其应用(上)转

https://mp.weixin.qq.com/s?__bizMzIzNjcwNzA2Mw&mid2247486427&idx1&sn61f9579bbe1dfe26da4b53eb538fee13&chksme8d28643dfa50f557c56ce8b5bc9b0597a157a20791e21b1812fe2a30ff4cf2c813608473b43&mpshare1&scene23&srcid#rd 一、前言 市面上有很…

jquery笔记一:下载安装、语法、选择器、遍历选择元素的方法、jQuery动画

目前 jQuery 兼容于所有主流浏览器, 包括 IE 6!开发时常用 jquery.js,上线用 jquery.min.js。 jq插件 目前jQuery有三个大版本: (1)1.x.x: 兼容ie6,7,8,使用最为广泛,官网只做BUG维护&#xff…

jquery简介 each遍历 prop attr

一、JQ简介 jQuery是一个快速、简洁的JavaScript框架,它封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。 装载的先后次序:  jQuery封装库在上&#xff0…

如何让Visitor变得可爱1

本文转自:http://www.cnblogs.com/idior/archive/2005/01/19/94280.html 在wayfarer的文章中提到了如何利用visitor模式实现添加新的功能。如他所说,在实际过程中显的不是那么可爱。不过他为我们提供了一个可行的解决方案,本文将在此基础上使…

EJB 3.x:生命周期和并发模型(第1部分)

Java EE组件生命周期和与并发相关的详细信息对于经验丰富的专业人员而言可能不是新知识,但是对于初学者而言,这可能需要花费一些时间。 就EJB而言,了解其生命周期 (以及相关的并发场景)对于确保使用EJB的正确用法和解…

链表定义

public class Node {//节点内容,成员变量int data;//下一个节点,定义成员变量,类型为Node类型,不进行初始化Node next;//定义构造函数,获取参数data的值public Node(int data) {this.datadata;}//为节点追回节点public…

单独使用 laydate 日期时间组件

layui 日期和时间组件官方文档 需要注意几点: 下载压缩包后,复制整个 laydate 文件夹放到项目中,里面的文件不要改动位置,否则会报错;在移动端使用时,要给 input 添加 readonly 属性,否则点击…

从零开始学习SVG

1 什么是SVG? MDN中的定义是:SVG即可缩放矢量图形(Scalable Vector Graphics,SVG),是一种用来描述二维矢量图形的 XML 标记语言。 简单地说,SVG 面向图形,HTML 面向文本。SVG 与 Flash 类似&am…

Flash/Flex学习笔记(39):弹性运动

动画中的弹性运动 从视觉效果上接近 物理经典力学中的单摆运动或弹簧(胡克定律FKx)振动 先看下面的模拟演示: 规律: 小球先从出发点(初始为最左侧)向目标点(中心点)加速狂奔,奔的过程中速度越来越大,但加速度越来越小,…