使用自动机的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,一经查实,立即删除!

相关文章

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

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

Java EE:异步构造和功能

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

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

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

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

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

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的正确用法和解…

单独使用 laydate 日期时间组件

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

从零开始学习SVG

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

layui 关于layDate设置时间限制问题

前面是尝试结果,有兴趣的可以康康,赶时间的可以直接翻到底下 ----->直达车 因为只有一个页面,没什么标准,所以自己就使用了layui的时间控件,并且作为独立组件。 第一次尝试 - 使用 min 一开始只想让结束时间有个…

QQ聊天记录快速迁移

QQ聊天记录快速迁移 在工作中大家经常会用到QQ来沟通,但是很多时候在其它设备上登录QQ就无法查看到之前的聊天记录和图片,这是因为电脑上的QQ聊天记录一般都是保存在电脑本地硬盘里,所以我们在换设备登录QQ后,是无法查看到之前电脑…

Hawtio和Jolokia的休眠统计

企业Java的很大一部分处理数据。 在企业设置中使用数据的所有不同方式中,仍然存在使用任何种类的O / R映射的行之有效且广泛教授的方法。 JPA标准使每个人都可以轻松使用它,并且它也应该是可移植的。 但是,我们不要谈论迁移细节。 O / R映射的…

laydate 时间控件去掉秒以及解决在移动端不能滑动的问题

一、时间控件去掉秒&#xff0c;保留时分 二、时间控件在移动端不能滚动 一、时间控件去掉秒&#xff0c;保留时分 方法一&#xff1a;使用 ready 回调函数 ready 控件在打开时触发。打开控件时让秒消失。 <script> laydate.render({elem: #endTime, //指定元素trigg…

Entity Framework Code First属性映射约定 转载https://www.cnblogs.com/libingql/p/3352058.html

Entity Framework Code First属性映射约定 Entity Framework Code First与数据表之间的映射方式有两种实现&#xff1a;Data Annotation和Fluent API。本文中采用创建Product类为例来说明tity Framework Code First属性映射约定的具体方式。 1. 表名及所有者 在默认约定的情况下…

layui 时间控件二次渲染,点击一个自定义按钮清空/重置时间控件

标题小标题一、错误尝试二、时间控件二次渲染的3种方法2.1 直接删除原来绑定时间控件的DOM&#xff0c;再重新渲染&#xff08;推荐&#xff09;&#xff1b;2.2 使用 clone() &#xff0c;并且改变 lay-key&#xff1b;2.3 使用 clone() &#xff0c;并且删除 lay-key&#xf…

2019年春第二次课程设计实验报告

一、试验项目名 贪吃蛇 二、试验功能介绍 通过数组构造小蛇&#xff0c;在通过数组中的变化控制小蛇移动和变长。 三、项目模块结构介绍 构造小蛇 小蛇移动 移动中碰到边框或自己失败 小蛇长大 四、实现界面展示 五、代码托管链接https://gitee.com/t001023/software_class_1_t…

Elasticsearch用例:全文搜索

在本系列有关Elasticsearch用例的最后一篇文章中&#xff0c;我们介绍了Elasticsearch提供的用于存储甚至大量文档的功能 。 在这篇文章中&#xff0c;我们将研究其另一个核心功能&#xff1a;搜索。 我正在利用上一篇文章中的某些信息&#xff0c;因此&#xff0c;如果您还没有…