Lucene&solr 4 实践(4)

简介: 假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。本部分主要分析FST,快乐理解lucene fst包的源码细节和来龙去脉。

首先请下载好这3paper

Minimization of Sequential Transducers

Direct Construction of Mimimal Structure Acyclic Subsequential Transducers

Direct Building of Mimimal Automation for Given List

总体说明:

(1)直接进入fst 原始算法,请看Direct Construction of Mimimal Structure Acyclic Subsequential Transducers 论文第3部分。

(2)需要预备知识,请看论文Direct Building of Mimimal Automation for Given List2部分,并结合

Direct Construction of Mimimal Structure Acyclic Subsequential Transducers 3部分

(3)深入认识FST,请看论文Minimization of Sequential Transducers

(4)Lucene4 FST就是对于的FST包了org.apache.lucene.util.fst

maven pom 的参考

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>og.apache.lucene</groupId>

<artifactId>lucene-core</artifactId>

<version>4.0.0-src-SNAPSHOT</version>

 <name>lucene-core</name>

<description>lucene-core</description>

<packaging>jar</packaging>

<url>http://maven.apache.org</url>

   <build>

    <plugins>

       <plugin>

          <groupId>org.apache.maven.plugins</groupId>

          <artifactId>maven-source-plugin</artifactId>

          <executions>

              <execution>

                <id>attach-sources</id>

                 <goals>

                   <goal>jar</goal>

                 </goals>

              </execution>

          </executions>

       </plugin>

       <plugin>

          <artifactId>maven-compiler-plugin</artifactId>

          <configuration>

              <source>1.6</source>

              <target>1.6</target>

             <encoding>UTF-8</encoding>

          </configuration>

       </plugin>

       <plugin>

          <groupId>org.apache.maven.plugins</groupId>

          <artifactId>maven-compiler-plugin</artifactId>

          <configuration>

              <source>1.6</source>

              <target>1.6</target>

               <encoding>UTF-8</encoding>

          </configuration>

       </plugin>

    </plugins>

    <resources>

       <resource>

          <directory>src/main/resources</directory>

          <includes>

             <include>***.properties</include>

          </includes>

          <filtering>true</filtering>

       </resource>

    </resources>

 </build>

      <dependencies>

          <dependency>                      

              <groupId>junit</groupId>

              <artifactId>junit</artifactId>

              <version>4.10</version>

               <scope>test</scope>

          </dependency>      

  <dependency>

    <groupId>org.apache.lucene</groupId>

    <artifactId>lucene-test-framework</artifactId>

    <version>4.0.0</version>

    <scope>test</scope>

  </dependency>

      </dependencies>

</project>

之后将lucene-core 对于的src 替换

call mvn -U eclipse:clean eclipse:eclipse -DdownloadJavadocs=true -DdownloadSources=true

生成的目录,基本上lucene-core 代码工程搞定。

 

0 Lucene FST

FST的实现是参考论文Direct Construction of Mimimal Structure Acyclic Subsequential Transducers!也即通过输入的有序term list(在lucene4里面string先转化为 byte[],生成byteRefbyteRef作为input用来生成FST),生成最小、无环、有向、最小自动机。单纯看算法伪码,看的懂流程,不一定看的懂原因和为何。整个代码逻辑是依据相关原理来组织的,并且lucene fst的实现者是一个有着10coding经验、花销10天搞定的,对我等屌丝来说,首先得理解这个deep theroy,并结合代码学习。单纯从代码反推原理似乎非常无门路。

 

辅助知识:

1.生成最小、无环、有向、最小自动机

为什么是最小、最小如何定义、为什么无环、又为什么是自动机而不是hash or之前的前缀压缩

最小:就是没有冗余的状态信息,当然有最小就有非最小了,非最小对于空间、性能有损耗。从非最小到最小的转换首先是概念的描述、定义、形式化证明的过程,最后是代码实践。

最小定义:参加 Direct Building of Mimimal Automation for Given List 2部分,实现最小化原理参考论文

Minimization of Sequential Transducers 3部分。

为什么无环:有怀意味着转换时,会出现死胡同,没有最终状态,也就服务从输入映射一个输出

自动机:查找快速、数据结构紧凑

 

2.基本关系: FSA FST

FSA 可以简单理解,是说通俗的认识,就看做一个模型或者一种数据结构或者一颗树。当然看做一个图更贴切吧! FST 相对FSA来说,多了一个输出信息。也就是当前状态 +输入 +输出--> 下个状态,而FSA 当前状态+输入--> 下一个状态。 FST 既有状态的转移信息,当前状态到下一个状态,更有当前输出信息到一个状态输出信息。前者是状态的关联,前后状态依赖弧上的char,后者的输出状态里面包含了前面的状态信息,是拼接的。也就是输出信息是结合,而状态只会唯一。

 

3.有向、最小自动机基本定义、原理

基本定义、基本原理是后面最小化、直接构造的前提。

这部分看 Direct Building of Mimimal Automation for Given List 论文的第2 部分,重点理解两块信息

状态转移原理、输出变换原理,然后是集合的操作符号的理解,之后结合Direct Construction of Mimimal Structure Acyclic Subsequential Transducers 论文的第2部分。

注意理解递归、结合Fig1 Fig2 来理解定理和证明过程!算法细节就不copy到这里了。

 

论文中几个符号提示

A\B 表示   属于集合A 单步属于集合B ,等同 A-B

(a,b) 是表示序偶,可以通俗理解a 映射到b关系,或者从a 转移到b的过程

 这个符号是论文自定义的

A 表示任意的意思

E 表示存在的意思

Lucene&solr <wbr>4 <wbr>实践(4表示集合的闭包

if only if 充分必要条件

 

4.算法伪码

Direct Construction of Mimimal Structure Acyclic Subsequential Transducers 论文第3部分

伪码是完成从输入有序list 到输出最小有向自动转换机FST,至于FST的输出如何使用起来没有进一步说明,在lucene4 fst包里面 FST的输出直接影响着相关数据结构。

 

5.Lucene4 FST

在前面学习基础上接下来理解Lucene FST未完待续

http://lucene.472066.n3.nabble.com/SynonymFilter-FST-and-Aho-Corasick-algorithm-td3994656.html

目录
相关文章
|
6月前
|
索引
lucene入门使用
lucene入门使用
38 2
|
XML 存储 JSON
Solr学习总结
Solr学习总结
156 0
Solr学习总结
|
XML JSON 搜索推荐
和 Solr 对比|学习笔记
快速学习和 Solr 对比。
109 0
|
XML 存储 JSON
和 Solr 对比 | 学习笔记
快速学习和 Solr 对比
|
存储 搜索推荐 Java
全文搜索引擎 Lucene Solr ElasticSearch 关系?
全文搜索引擎是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
全文搜索引擎 Lucene Solr ElasticSearch 关系?
|
存储 SQL 编解码
Solr-lucene 使用案例大全
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。 本文sole lucene的使用案例汇总。
231 0
|
自然语言处理 索引
Lucene&solr 4 实践(3)
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。本部分主要是针对FSA FST做前期知识储备和基本概念扫盲。FST是lucene4 solr4 的索引和查询的核心! 下面的内容来自多个出去,出去就不一一列举。
118 0
Lucene&solr 4 实践(3)
|
自然语言处理 算法 架构师
Lucene&solr 4 实践(8)
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。Lucene 5 有哪些点对大数据倒排索引和检索有优势 1.索引懒加载lazy加载,意味着按时间段或者其他分割的数据可以按需加载 2.FST词典结构以及基于图的索引、查询,使得内存消耗更低 3.异步合并,使得增量索引合并时的“索引整理”开销或者对查询影响更小 4.commitpoint 视图下reader自动更新,使得大规模数据的虚拟分组、全量切换更加方便。
146 0
|
编解码 缓存 自然语言处理
Lucene&Solr 4 实践(2)
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。在第一部分,还不完善基础上,进入第二部分吧。结合源码来认识lucene! 重点是:从需求到方案到实践编码到结果、从原理到实现、从结构到细节、从总体认识到西部深入。
107 0
|
自然语言处理 Java API
Lucene&solr 4 实践(1)
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。Solr&Lucene 4.0 好,很好,很强大。对于从lucene2.0 solr0.9 就关注,一直过来的人来讲, 4.X序列除了的架构、风格、API改变了很多很多,更重要的是业务的优化口子更多了,专业知识要求更高。整个架子的容量、包容性、以及适应信息检索的科研,直接上来demo运行easy、深入会很难。需要整理了解的知识点太多了。
108 0