关于后端:Elasticsearch中FST与前缀搜索

55次阅读

共计 4690 个字符,预计需要花费 12 分钟才能阅读完成。

FST 的基本概念

FST(Finite-State Transducer)是一种无限状态自动机,能够将一组输出符号映射为一组输入符号。FST 由一组状态和一组转移组成,状态能够是起始状态、承受状态或既是起始状态又是承受状态。FST 能够用于字符串匹配、主动补全、拼写纠错等畛域。

上面是 FST 的一些基本概念:

  1. 状态(State):FST 蕴含一组状态,每个状态示意一个字符串的前缀或后缀。状态能够是起始状态、承受状态或既是起始状态又是承受状态。状态还能够与其余状态连贯造成转移。
  2. 转移(Transition):FST 中状态之间的连贯称为转移。转移示意从一个状态到另一个状态的过程,转移包含输出符号、输入符号和权重。输出符号示意以后状态到下一个状态的转移所须要的输出字符,输入符号示意该转移的输入字符,权重示意该转移的绝对重要性。
  3. 输出符号串(Input Symbol String):FST 承受一组输出符号作为查问,输出符号串是查问的一部分,能够是单个字符、单词或句子。FST 将输出符号串映射为一组输入符号,输入符号能够为空。
  4. 输入符号串(Output Symbol String):FST 将输出符号串映射为一组输入符号,输入符号串是由一组输入符号组成的字符串。输入符号串能够为空,也能够与输出符号串具备雷同的长度。
  5. 权重(Weight):权重是 FST 中转移的绝对重要性,用于计算最佳匹配、最短门路等问题。权重能够是浮点数、整数或其余类型。

以上是 FST 的基本概念,它们是了解 FST 的根底。理解这些概念能够帮忙您更好地了解 FST 的原理和利用。

FST 的创立和构建

FST 的创立和构建是指将一组输出符号映射为一组输入符号的过程,包含 FST 的数据结构、状态的增加和删除、转移的增加和删除、权重的赋值和调整等。

  1. FST 的数据结构:FST 通常应用有向图(Directed Graph)作为数据结构,每个节点示意一个状态,节点之间的边示意状态之间的转移。
  2. 状态的增加和删除:在构建 FST 时,咱们须要增加状态以示意字符串的前缀或后缀。状态的增加通常通过向 FST 中增加新节点来实现。如果一个状态不再须要,能够通过将其与其余状态的连贯断开并删除该节点来删除状态。
  3. 转移的增加和删除:在 FST 中,状态之间的连贯称为转移,转移示意从一个状态到另一个状态的过程。要将输出符号映射为输入符号,咱们须要在 FST 中增加转移。转移的增加通常通过向节点增加出边或入边来实现。如果一个转移不再须要,能够通过删除与该转移相关联的边来删除转移。
  4. 权重的赋值和调整:权重用于计算最佳匹配、最短门路等问题,因而在构建 FST 时须要为转移赋值权重。通常,权重是浮点数、整数或其余类型。在 FST 构建结束后,咱们可能须要依据需要调整权重,例如,删除一些权重太大或太小的转移,或调整权重以改善 FST 的性能。

了解 FST 的创立和构建过程能够帮忙咱们更好地了解 FST 的原理和利用。在理论利用中,咱们须要依据具体的需要来构建 FST,包含抉择适合的数据结构、增加和删除状态和转移、赋值和调整权重等。

FST 的查问和匹配

FST 的查问和匹配机制次要是基于无限状态自动机(Finite State Automaton, FSA)的原理,即通过状态转移的形式实现字符串匹配和搜寻。FST 的查问和匹配能够通过以下几种形式进行:

  1. 前缀搜寻:在 FST 中,前缀搜寻就是查找 FST 中所有以某个给定字符串为前缀的字符串。这种搜寻能够通过在 FST 上进行深度优先遍从来实现。具体来说,能够从 FST 的根节点开始,通过状态转移的形式遍历到所有以该前缀为前缀的字符串所对应的终止状态,并输入这些字符串。在遍历过程中,如果以后遍历的状态没有任何后继状态,那么阐明曾经达到了 FST 的开端,这时就能够进行遍历。
  2. 准确匹配:在 FST 中,准确匹配就是查找 FST 中所有等于给定字符串的字符串。这种匹配能够通过遍历 FST 上从根节点到终止状态的门路来实现。具体来说,能够从 FST 的根节点开始,顺次遍历 FST 上的每个字符,并依据每个字符对应的转移边进入下一个状态,直到遍历残缺个字符串。如果最初所达到的状态是终止状态,则阐明给定字符串在 FST 中存在。
  3. 含糊搜寻:在 FST 中,含糊搜寻就是查找 FST 中所有与给定字符串类似的字符串。这种搜寻能够通过构建一棵 Levenshtein 自动机来实现。Levenshtein 自动机是一种无限状态自动机,能够用来计算两个字符串之间的编辑间隔,并在编辑间隔不超过给定阈值的状况下找到与给定字符串类似的所有字符串。具体来说,能够先构建一个 Levenshtein 自动机,而后在该自动机上进行遍历,找到所有与给定字符串的编辑间隔不超过给定阈值的字符串。

以上是 FST 的查问和匹配机制的基本原理和实现形式,不同的查问和匹配形式的实现细节会有所不同,具体的实现能够参考具体的 FST 实现库的文档和代码。

FST 的利用

FST 在理论利用中有许多利用场景,其中包含:

  1. 主动补全和倡议:FST 能够用于实现主动补全和倡议性能。在搜索引擎或文本编辑器中,当用户输出一部分内容时,能够应用 FST 搜寻并返回与之匹配的后果,以帮忙用户疾速输出残缺内容。
  2. 拼写纠错:FST 能够用于实现拼写纠错性能。当用户输出的单词或短语与索引中的单词或短语不齐全匹配时,FST 能够搜寻并返回与之最类似的后果。
  3. 近似搜寻:FST 能够用于实现近似搜寻性能。当用户搜寻的关键词有肯定的模糊性时,FST 能够搜寻并返回与之最类似的后果。
  4. 自然语言解决:FST 能够用于实现自然语言解决性能。例如,在语音辨认和文本翻译等畛域中,FST 能够用于辨认和匹配不同的单词、短语和句子。
  5. 词法剖析:FST 能够用于实现词法剖析性能。在计算机科学和自然语言解决畛域中,FST 能够用于对自然语言文本进行分词、词性标注和语法分析等操作。

在 Elasticsearch 中,FST 被广泛应用于主动补全、拼写纠错和近似搜寻等性能中。Elasticsearch 应用 FST 作为外部数据结构,能够疾速地搜寻和匹配大量的文本数据。例如,当用户输出一个查问时,Elasticsearch 会应用 FST 搜寻并返回与之匹配的后果,从而进步搜寻效率和准确性。

FST 的优化和调优

对 FST 进行优化和调优能够进步搜寻性能和查问效率,以下是一些罕用的 FST 优化和调优技巧:

  1. 状态压缩:将 FST 中的冗余状态进行合并,以缩小状态数量,从而升高内存占用和查问工夫。
  2. 权重调整:为 FST 中的每个状态设置一个权重值,能够依据权重值对搜寻后果进行排序,从而进步搜寻品质和效率。
  3. 缓存优化:应用 LRU 缓存等算法对 FST 进行缓存,能够进步查问效率,尤其是在数据拜访频率高的状况下。
  4. 分片:将 FST 进行分片,能够将查问申请扩散到多个节点上,从而进步并发查问能力和零碎扩展性。
  5. 线程池:应用线程池等技术对查问进行并发解决,能够进步查问效率和零碎吞吐量。

综上所述,FST 的优化和调优对于进步搜寻性能和查问效率至关重要,须要依据具体场景和需要抉择适合的优化和调优策略。

前缀树

前缀树(Trie 树)是一种树形构造,用于解决字符串和单词,特地是用于疾速匹配和查找字符串和单词的数据结构。以下是前缀树的一些常见知识点:

  1. 基本概念:前缀树是由节点和边形成的树形构造,每个节点代表一个字符或字符串,边代表字符间的关系,根节点示意空字符串。
  2. 插入操作:将一个单词插入前缀树中的过程,是在树上顺次插入单词中的每个字符,如果该字符在树中不存在,则创立一个新节点,否则沿着已有的边向下挪动。
  3. 查问操作:在前缀树中查找一个单词或前缀,是在树上顺次查找单词中的每个字符,如果字符在树中存在,则沿着已有的边向下挪动,否则示意该单词或前缀不存在。
  4. 匹配操作:在前缀树中匹配多个单词或前缀,能够应用 Trie 树的变种(AC 自动机),它能够在一个树上匹配多个字符串。
  5. 压缩 Trie 树:将 Trie 树压缩成更小的树,以节俭空间和放慢查问速度。
  6. 优化 Trie 树:通过优化节点构造、应用哈希表等形式,能够进步 Trie 树的查问效率。
  7. 利用场景:前缀树被广泛应用于主动补全、拼写查看、搜索引擎等畛域。

FST(无限状态自动机)与前缀树有关系。实际上,前缀树能够看作是一种非凡类型的 FST,其中所有边都带有标签,标签的拼接形成了从根节点到叶子节点的字符串。因而,前缀树能够用于前缀搜寻,而且它只反对前缀搜寻。而 FST 是一种更通用的数据结构,能够反对前缀搜寻、准确匹配、近似搜寻等多种查问形式。它能够通过增加额定的状态和转换来反对更简单的操作,例如在 FST 中增加额定的转换来解决拼写错误或大小写变动。因而,能够将前缀树看作是 FST 的一种非凡状况。

Elasticsearch 中前缀树的应用场景

Elasticsearch 中的前缀树(Prefix Tree),也称为 Trie 树,是一种常见的数据结构,罕用于实现文本的主动补全、拼写纠错、近似搜寻等性能。

以下是 Elasticsearch 中应用前缀树的几个场景和举例说明:

  1. 主动补全:用户在搜寻框中输出局部关键字时,能够应用前缀树实现实时的主动补全倡议。例如,当用户输出 “elast” 时,前缀树能够返回 “Elasticsearch” 和 “Elastic Beanstalk” 等词条作为补全倡议。
  2. 拼写纠错:用户输出的搜寻关键词可能蕴含一些拼写错误,前缀树能够用于实现拼写纠错性能。例如,当用户输出 “elaticserach” 时,前缀树能够返回 “Elasticsearch” 作为纠错倡议。
  3. 近似搜寻:有时候用户的搜寻需要可能不太明确,须要对搜寻关键字进行含糊匹配。前缀树能够用于实现近似搜寻性能。例如,当用户输出 “lasticseach” 时,前缀树能够返回 “Elasticsearch” 作为最佳匹配。

总之,前缀树是 Elasticsearch 中十分重要的一个数据结构,广泛应用于文本搜寻和相干性能的实现。

当你想在 elasticsearch 中应用前缀树时,可能须要应用两个次要的 API:prefix查问和 completion 倡议。

prefix查问能够用于从指定的前缀开始匹配文档。上面是一个应用 prefix 查问的示例:

GET /my-index/_search
{
    "query": {"prefix" : { "title" : "quick"}
    }
}

这个查问将匹配 title 字段以 ”quick” 结尾的所有文档。在底层,elasticsearch 将应用前缀树来实现这个查问。

completion倡议能够用于实现主动实现和搜寻倡议等性能。上面是一个应用 completion 倡议的示例:

GET /my-index/_search
{
    "suggest": {
        "my-suggestion" : {
            "prefix" : "quick",
            "completion" : {"field" : "title-suggest"}
        }
    }
}

在这个示例中,completion倡议将依据用户输出的前缀来匹配文档中 title-suggest 字段的倡议。在底层,elasticsearch 将应用前缀树来实现这个倡议。

上面是一个简略的示意图,展现了如何应用前缀树来存储和匹配文档:

                    / (root)
                  /     |     \
                a       b       c
              /   \       \       \
            ap     at      b       ca
           /  \             |      / \
        apple  application   bye  car  cat

在这个示例中,根节点示意前缀树的根。每个节点代表一个前缀,子节点代表从该前缀开始的单词。在这个示例中,从 a 节点开始的前缀能够匹配 appleapplication,从 c 节点开始的前缀能够匹配 carcat。通过前缀树,能够疾速地查找匹配给定前缀的单词,实现疾速的搜寻和倡议性能。

本文由 mdnice 多平台公布

正文完
 0