在文章Automaton中我们介绍了确定型有穷自动机(Deterministic Finite Automaton)的概念,以及在TermRangeQuery中如何根据查询条件生成一个转移图,本文依旧根据该文章中的例子,介绍在Lucene中如何构建DFA,即生成图2的转移图,以及存储状态(state)、转移(transition)函数的数据结构。

  我们再次给出文章Automaton中的例子:

图1:

  图1的第79行代码描述了TermRangQuery的查询范围为["bc","gch"],下文中会用minValue来描述下界"bc"、maxValue来描述上界"gch",根据minValue、maxValue构建的DFA如下所示:

图2:

  图2中,接受语言L完整描述是 A = ({0,1,2,3,4,5}, {0,… ,255}, ,0,{1,3,4,5}):

  • {0,1,2,3,4,5}:描述的是有穷的状态(State)集合,即有0~5共6个状态
  • {0,… ,255}:描述的是有穷的输入符号集合,即输入的符号是256种ASCII码
  • :描述的是转移函数,Lucene中用两个int类型的数组transitions、states描述,下文会展开介绍
  • 0:描述的是初始状态,即状态0
  • {1,3,4,5}:描述的是可接受状态或终结状态

  上述内容如果没看明白请先阅读文章Automaton。

构建DFA的流程图

图3:

  为了便于介绍Lucene中构建DFA的流程,图3中描述的流程是根据图1的例子给出的,即一个特例DFA的构建过程,实际的构建流程基于边界问题(例如maxValue的值为null、minValue的值跟maxValue是相等),非确定性(non-deterministic)自动机等一些条件会导致相当复杂的分支流程,故无法一一列出,不过在掌握了图3的流程实现后,再根据源码来了解全面的构建流程就变得十分简单了。

  在介绍图3的流程之前,我们先介绍下Lucene是如何描述(存储)转移函数的。

  Lucene通过两个int类型的数组transitions、states来描述转移函数:

  • transitions数组:数组中使用固定的连续的三个数组元素来描述一个转移函数的三个信息

    • 目标状态dest,描述的是当前状态转移到下一个状态,该状态即目标状态dest
    • 输入符号的最小值min,描述的是当前转移可接受的最小输入符号
    • 输入符号的最大值max,描述的是当前转移可接受的最大输入符号
  • states数组:数组中使用固定的连续的两个数组元素来描述当前状态的两个信息

    • 第一个信息:当前状态的第一个转移函数信息在transitions数组中的起始位置
    • 第二个信息:当前状态的转移函数的数量

  我们以状态0为例,由图2可知,它包含了三个转移函数,如下所示:

  上述公式是如何得出见文章Automaton中的介绍,该公式的转移函数信息用transitions、states数组存储如下所示:

图4:

  图4中,状态0的状态值为0,即curState = 0,根据公式 跟分别获得states[ ]数组的两个下标值,这两个下标值对应的数组元素分别描述了状态0的第一个转移函数信息在transitions数组中的起始位置,以及状态0的转移函数的数量,由于transitions数组中用固定数量的数组元素描述一个转移函数的信息,故length的值为 ;对于状态0的第一个转移函数,dest描述了转移到下一个状态的状态值,即状态2,并且接受最小值min为98(ASCII码,对应字符"b")、最大值max为98的输入符号,也就说状态0到状态2的转移只接受字符"b"。

  另外状态0的三个转移函数是根据min值进行排序的,其目的是在读取阶段能更快的判断term是否在查询条件范围内,具体过程在介绍TermRangeQuery时再展开。

看这里:https://www.amazingkoala.com.cn/Lucene/gongjulei/2020/0727/157.html

Lucene Automaton(二)相关推荐

  1. 【lucene系列学习二】Lucene实现高亮显示关键词

    首先,导入下图所示库 然后,import org.apache.lucene.search.highlight.*; 下面,我们新建一个实现高亮显示功能的函数 public static String ...

  2. 【搜索那些事】细谈lucene(一)初识全文资源检索框架lucene

    一:lucene历史和简介 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.它不是一个完整的搜索应 ...

  3. 一、搜索引擎篇-揭开es神秘的面纱

    一.es是什么? elasticsearch是一个开源的分布式.RESTful 风格的搜索和数据分析引擎,它的底层是开源库lucene. 二.lucene是什么? 最受欢迎的java开源全文搜索引擎开 ...

  4. Elasticsearch的介绍 以及使用python操作es详细步骤

    一. 什么是 Elasticsearch 想查数据就免不了搜索,搜索就离不开搜索引擎,百度.谷歌都是一个非常庞大复杂的搜索引擎,他们几乎索引了互联网上开放的所有网页和数据.然而对于我们自己的业务数据来 ...

  5. 搭建Solr搜索引擎——Linux 爱旅行

    一. 下载Solr 官网:https://lucene.apache.org/solr/ 下载地址:https://lucene.apache.org/solr/downloads.html 历史版本 ...

  6. Lucene.Net 2.3.1开发介绍 —— 二、分词(一)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(一) Lucene.Net中,分词是核心库之一,当然,也可以将它独立出来.目前Lucene.Net的分词库很不完善,实际应用价值不高.唯 ...

  7. 剖析Elasticsearch集群系列之二:分布式的三个C、translog和Lucene段

    2019独角兽企业重金招聘Python工程师标准>>> 剖析Elasticsearch集群系列之二:分布式的三个C.translog和Lucene段 博客分类: java 搜索引擎, ...

  8. Lucene学习——IKAnalyzer中文分词(二)

    一.环境 1.平台:MyEclipse8.5/JDK1.5 2.框架:Lucene3.6.1/IKAnalyzer2012/htmlparser 二.目标 1.整合前面连篇文章(Lucene学习--I ...

  9. Lucene基础(二)--索引的操作

    索引的操作 我们建立所有就是要达到快速检索的目的,对数据能够方面便的查找,和数据库类似,索引也有自己的相关增删改查的操作.  在索引的增删改查中,增删改属于写操作,主要是有IndexWrite提供的方 ...

  10. Lucene 查询TopN的优化(二)

    在上一篇文章的结尾,我们总结了使用NumericDocValues优化查询TopN的原理:假设查询TopN的排序规则为按照正排值从小大小的顺序,即正排值越小,优先级越高.故在开启优化后,当收集器收到一 ...

最新文章

  1. Android5.1.1 - zygote中获取系统服务时抛出异常
  2. BAT也无法自我突破的战略困境解读
  3. 做优化的数据库工程师请参考!CynosDB的计算层设计优化揭秘
  4. ListView列表刷新方法的区别
  5. 2019.08.26关于分页
  6. YOLOV5+Deepsort行人跟踪初探
  7. jQuery,Table表头固定插件chromatable存在的问题及解决办法
  8. Spring MVC AOP 初步学习
  9. 风控建模二、特征工程---通用
  10. MS17010原生打法
  11. WIN10教育版怎么可以变更为专业版
  12. 获取当前经纬度 和 通过经纬度 得到大致位置的接口
  13. 2021年3月30日百度笔试题
  14. Effective C++ 读书笔记(五)
  15. 计算机网络.第四节课.笔记.CRC循环冗余检验、透明传输、SOH、EOT、PPP点对点协议、零比特填充、字节填充
  16. iPhone5翻新机卡贴机,妖机真实信息获取方法
  17. 日常生活-不帮人投资理财
  18. android Web App开发
  19. 程序的Squeeze函数的功能是删除字符串s中所出现的与变量c相同的字符
  20. 2021-05-18 人头检测 version-slim(主干精简速度略快),version-RFB(加入了修改后的RFB模块,精度更高)

热门文章

  1. 手把手教你禁止访问某个网站
  2. oracle数据库中的同义词,Oracle创建数据库同义词
  3. epson机器人编程 范例_Epson机械手简单实例编程
  4. 厦门大学2019年数学分析考研试题参考解答
  5. 什么是bypass(转载)
  6. t’触发器真值表和状态方程_t触发器(d触发器真值表)
  7. 群赛 round#5 解题报告(superoxide,choice,rpwt)
  8. pci和pcie的区别
  9. PageHelper.startPage();的使用
  10. 数字集成电路设计流程