在本文中,我记录了在 PostgreSQL(使用 Django ORM)和 ElasticSearch 中实现全文搜索 (FTS) 时的一些发现。...PostgreSQL 从 2008 年开始支持全文搜索 (FTS),Django 从 1.10 (2016) 开始通过 django.contrib.postgres 支持 FTS。...当前的 Django 集成不直接支持 Stemming 或 Fuzziness ElasticSearch ElasticSearch 是一个非常成熟的名称,有很多库可用于与 Django 和其他框架集成...因此,如果项目不打算拥有数千万条记录或大规模数据,Postgresql 全文搜索将是最佳选择。 术语 词干提取:这是将单词简化为其根形式的过程,以确保该单词的变体在搜索过程中与结果匹配。...NGram 可用于部分搜索单词,甚至从中间搜索单词。最常用的 NGram 类型是 Trigram 和 EdgeGram。 模糊性:模糊匹配允许您获得不完全匹配的结果。
最近遇到一个需求,需要在一个100万的表中通过关键字对一个大型字符字段进行检索,类似于百度搜索引擎的搜索,查询出所有包含关键字的数据并进行分页处理,并且将匹配度最高的数据排在第一位,要求查询响应时间控制在...每个数据库可以不包含全文目录或包含多个全文目录,一个全文目录可以包含多个全文索引,但一个全文索引只能用于构成一个全文目录。 一个数据表只能创建一个全文索引,一个全文索引可以包含多个字段。...如果 SQL 查询包含全文搜索查询,则在编译和执行期间该查询都会发送到全文引擎。查询结果将与全文索引相匹配。 全文引擎 SQL Server 中的全文引擎现已与查询处理器完全集成。...断字符:断字符用来对全文搜索数据进行语言分析,查找单词的边界,也就是怎样将一段很长的内容拆分成日常的词语或字。...,当搜索的时候匹配的速度就会非常快,这就需要一个很完善的数据字典表。
对于这类的搜索,关系型数据库的索引就很难应付了,适合使用全文搜索的倒排索引。 倒排索引是一种数据库的索引形式,存储了 “内容 -> 文档” 映射关系,目的是快速的进行全文搜索。 2....#2 “Recipe of delicious carbonara pasta” 先对文档进行分词,形成一个个的 token,也就是 单词,然后保存这些 token 与文档的对应关系。...2.2 倒排索引搜索 搜索示例: 搜索 “pasta recipe” 先分词,得到2个 token,( “pasta”、“recipe” )。 然后去倒排索引中进行匹配。 ?...这2个词在2个文档中都匹配,所以2个文档都会返回,而且分数相同。 搜索 “carbonara pasta” ? 同样,2个文档都匹配,都会返回。...think” 词干分析 通过切断词尾将一个词转换成词根形式的过程。
例如,「英语分析器」去掉一组英语无用词(常用单词,例如 and、the、to、by,因为它们对相关性没有多少影响),它们会被删除。由于理解英语语法的规则,这个分词器可以提取英语单词的词干。...但是,当我们在全文域搜索的时候,我们需要将查询字符串通过相同的分析过程,以保证我们搜索的词条格式与索引中的词条格式一致。...全文查询,理解每个域是如何定义的,因此它们可以做正确的事: 当你查询一个「全文域」时,会对查询字符串应用相同的分析器,以产生正确的搜索词条列表 当你查询一个「精确值域」时,不会分析查询字符串,而是搜索你指定的精确值...# 指定分析器 当 Elasticsearch 在文档中检测到一个新的字符串域,它会自动设置其为一个「全文字符串域」,并使用「标准分析器」对它进行分析。但是你不希望总是这样。...「词干过滤器」把单词遏制为词干。「ascii_folding 过滤器」移除变音符,把一个像 "très" 这样的词转换为 "tres"。
介绍 全文搜索(FTS)是搜索引擎用于在数据库中查找结果的技术。它可用于为商店,搜索引擎,报纸等网站上的搜索结果提供支持。...更具体地说,FTS检索文档,这些文档是包含文本数据的数据库实体,与搜索标准不完全匹配。...在本教程中,我们将使用PostgreSQL存储包含假设新闻网站文章的数据,然后学习如何使用FTS查询数据库并仅选择最佳匹配。最后一步,我们将对全文搜索查询实施一些性能改进。...此外,该功能允许您指定要使用的语言以及所有单词是否必须存在于结果中或仅包含其中一个单词。 该@@运营商标识,如果tsvector匹配的tsquery或其他tsvector。...结论 本教程介绍了如何在PostgreSQL中使用全文搜索,包括准备和存储元数据文档以及使用索引来提高性能。
词干提取(Stemming) nltk.stemmer.porter.PorterStemmer 类是一个用于从英文单词中 获得符合语法的(前缀)词干的极其便利的工具。...这一能力尤其让我心动,因为我以前曾经用 Python 创建了一个公用的、全文本索引的 搜索工具/库(见 Developing a full-text indexer in Python 中的描述,它已经用于相当多的其他项目中...NLTK 中包括一个用于单词词干提取的极好算法,并且让您可以按您的喜好定制词干提取算法: 清单 4....您是否需要一个完全由词干构成的索引?或者您是否在索引中同时包括完整的单词 和词干?您是否需要将结果中的词干匹配从确切匹配中分离出来?...无论如何,一般来说添加词干提取是非常简单的:首先,通过特别指定 gnosis.indexer.TextSplitter 来从一个文档中获得词干;然后, 当然执行搜索时,(可选地)在使用搜索条件进行索引查找之前提取其词干
这些搜索功能从2014年上线至今,已经多年没有更新底层搜索技术,聊天记录使用的全文搜索引擎还是SQLite FTS3,而现在已经有SQLite FTS5,收藏首页的搜索还是使用简单的Like语句去匹配文本...支持用Porter Stemming算法对英文单词取词干。取词干的好处是允许用户搜索内容的单复数和时态跟命中内容不一致,让用户更容易搜到内容。...但是取词干也有弊端,比如用户要搜索的内容是“happyday”,输入“happy”作为前缀去搜索却会搜不到,因为“happyday”取词干变成“happydai”,“happy”取词干变成“happi”...这种badcase在内容为多个英文单词拼接一起时容易出现,联系人昵称的拼接英文很常见,所以在联系人的索引中没有取词干,在其他业务场景中都用上了。 支持将字母全部转成小写。...当然,也不能保留太多业务数据不建索引,这样用户要搜索时会来不及建索引,从而导致搜索结果不完整。
这个分析过程包括将文本分割成单词、去除停用词(如“the”、“and”、“a”等常见的无意义单词)、进行词干提取(将单词转换为其基本形式,如“running”转换为“run”)等操作。...经过分析后的文本被存储在全文索引中,以便后续的搜索操作。 索引构建 在分析完文本后,MySQL 会构建全文索引。全文索引通常是一种倒排索引结构,它将每个单词与包含该单词的记录列表相关联。...例如,如果有一篇文章包含单词“apple”,那么在全文索引中,“apple”这个单词将与包含该文章的记录相关联。...这样,当我们搜索“apple”这个单词时,MySQL 可以快速地找到包含该单词的记录。...); 执行全文搜索 一旦创建了全文索引,我们就可以使用MATCH AGAINST语句来执行全文搜索。
这些搜索功能多年没有更新底层搜索技术,聊天记录使用的全文搜索引擎还是 SQLite FTS3,而现在已经有 SQLite FTS5;收藏首页的搜索还是使用简单的 Like 语句来匹配文本;联系人搜索甚至用的是内存搜索...第四,支持用Porter Stemming算法对英文单词取词干。取词干的好处是允许用户搜索内容的单复数和时态跟命中内容不一致,让用户更容易搜到内容。...但是取词干也有弊端,比如用户要搜索的内容是 “happyday” ,输入 “happy” 作为前缀去搜索却会搜不到,因为 “happyday” 取词干变成 “happydai” , “happy” 取词干变成...这种 badcase 在内容为多个英文单词拼接一起时容易出现。联系人昵称的拼接英文很常见,所以在联系人的索引中没有取词干,在其他业务场景中都用上了。 第五,支持将字母全部转成小写。...比如在联系人搜索任务中,我们将联系人的普通文本搜索、拼音搜索、标签和地区的搜索、多群成员的搜索并行执行,搜完之后再合并结果进行排序。这里为什么不也用拆表的方式呢?
} } 6.多数字段 全文搜索被称作是 召回率(Recall) 与 精确率(Precision) 的战场: 召回率 ——返回所有的相关文档; 精确率 ——不返回无关文档。...移除变音或口音词:如 ésta 、 está 和 esta 都会以无变音形式 esta 来索引。...短语匹配 就像 match 查询对于标准全文检索是一种最常用的查询一样,当你想找到彼此邻近搜索词的查询方法时,就会想到 match_phrase 查询 。...,且各词项顺序也与我们搜索指定一致的文档,中间不夹杂其他词项。...我们讨论 全文搜索 一章的 控制精度 也是同样的问题: 如果七个词条中有六个匹配, 那么这个文档对用户而言就已经足够相关了, 但是 match_phrase 查询可能会将它排除在外。
定义 Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎。它允许您快速,近实时地存储,搜索和分析大量数据。它通常用作底层引擎、技术,为具有复杂搜索功能和要求的应用程序提供支持。...但是 Lucene 操作复杂,一般不直接利用 Lucene 作为搜索引擎,ElasticSearch 就是利用 Java 简化了 Lucene 的使用。 3....应用场景 全文检索:例如淘宝 app 搜索 17寸电脑关键词,搜索系统将依据关键词分词查询,按照指定的匹配度返回对应的商品。这是 ES 最核心也是最常用的功能。...使用前面的索引搜索 +Quick +fox 不会得到任何匹配文档。(记住,+ 前缀表明这个词必须存在。)...foxes 可以 词干提取 --变为词根的格式-- 为 fox 。类似的, dogs 可以为提取为 dog 。 jumped 和 leap 是同义词,可以索引为相同的单词 jump 。
搜索引擎匹配查询到它们创建的索引上。这个索引包含每个文档的单词,和能指向文儿当地址的指针。这被叫做倒排索引文件【 inverted file】。...为了删除停用词,算法将文档中的索引词候选词与停用词列表进行比较,并从搜索索引中删除这些词语。 第6步:检索词词根化(词干提取)。词干提取可以在一层又一层的处理中递归地删除单词后缀。这个过程有两个目标。...在效率方面,词干提取减少了索引中唯一单词的数量,从而减少了索引所需的存储空间并加快了搜索过程。在有效性方面,词干提取通过将所有形式的单词缩减为基础词或词干形式来改善检索。...它可能会对所有形式的词干匹配的精度产生负面影响,当现实中,用户希望查询结果仅仅来自匹配查询中实际使用的单词时。 系统可以实现强干扰算法或弱干扰算法。...首先,许多单词具有多重含义 - 它们是多义的。例如这样的词"pool"或者”fire“。呈现给用户的许多不相关文档来自匹配正确的单词,但具有错误的含义。
Elasticsearch 使用一种称为倒排索引的结构,它适用于快速的全文搜索。 一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。...现在,如果我们想搜索 quick brown ,我们只需要查找包含每个词条的文档: ? 两个文档都匹配,但是第一个文档比第二个匹配度更高。...使用前面的索引搜索 +Quick +fox 不会得到任何匹配文档。(记住,+ 前缀表明这个词必须存在。)...foxes 可以 词干提取 –变为词根的格式– 为 fox 。类似的, dogs 可以为提取为 dog 。 jumped 和 leap 是同义词,可以索引为相同的单词 jump 。...但是,如果我们对搜索的字符串使用与 content 域相同的标准化规则,会变成查询 +quick +fox ,这样两个文档都会匹配!
你想要 你要看 将类似的词分组以搜索 词干提取;分词;文档分析 查找具有相似含义的词语以搜索 潜在语义分析 生成名称 词汇拆分 估计阅读文本需要多长时间 阅读时间 估计一段文本阅读的难度 文本可读性 识别文本的语言...在这种情况下,词干不一定是语言学家所论的形态上的词根。所以它不是单词的某种形式,你可能没法在词汇表上找到。...词干提取的典型应用是将具有相同词干的词的所有实例组合在一起以供在搜索库中使用。因此,如果用户搜索包含“friend”的文档,他们也会找到“friends”或“friended”的文档。...例如,happy的 3 元模型是: $ha hap app ppy py $ 用符号$来表示单词的开始和结束。 用于搜索的确切方法超出了本文的范围。...那是因为 10个 3 元模型中有 7 个是相匹配的。完全匹配会排在更高的位置,但因为“locamotive”这个词并不存在,所以它一般没有其他匹配。
它根据 Unicode 联盟 定义的 单词边界 划分文本。删除绝大部分标点。最后,将词条小写。...例如, 英语 分析器附带了一组英语无用词(常用单词,例如 and 或者 the ,它们对相关性没有多少影响),它们会被删除。 由于理解英语语法的规则,这个分词器可以提取英语单词的 词干 。...但是,当我们在全文域 搜索 的时候,我们需要将查询字符串通过 相同的分析过程 ,以保证我们搜索的词条格式与索引中的词条格式一致。...全文查询,理解每个域是如何定义的,因此它们可以做 正确的事: 当你查询一个 全文 域时, 会对查询字符串应用相同的分析器,以产生正确的搜索词条列表。...指定分析器编辑 当Elasticsearch在你的文档中检测到一个新的字符串域 ,它会自动设置其为一个全文 字符串 域,使用 标准 分析器对它进行分析。 你不希望总是这样。
之前我们通过程序整理过一份 Python 及编程相关的英语高频词汇表:我们用程序整理出了一份Python英语高频词汇表,拿走不谢!...,ECDict 提供了一些英文词汇处理的实用方法: 词干查询 这里说的词干,就是我们前面提到的 Lemma。...对于查不到的单词,再依据各种算法生成(判断词尾 -ed,-ing 等)。 模糊匹配 搜索时可通过 strip-word 进行模糊匹配。...base, longtime base, … 数据读写 基于 CSV、SQLite、MySQL 的单词读写、查询、匹配、条件、修改、删除等。...对于这一段《肖申克的救赎》中的台词,我们先用正则取出了里面的单词,再通过 LemmaDB 获取每个单词的词干。
全文索引全文索引用于全文搜索,它能够高效地处理包含大量文本的字段的搜索需求,如文章、博客等。文本搜索:全文索引支持对文本内容进行模糊匹配和搜索。...自然语言处理:全文索引通常结合自然语言处理技术,如词干提取、同义词处理等,以提高搜索的相关性和准确性。哈希索引哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才能使用哈希索引。...全文索引优化了基于文本的搜索操作,如关键词搜索、模糊匹配等。它能够处理复杂的搜索查询,如包含、不包含、接近等。...B-Tree索引适用于各种类型的查询,包括全值匹配和范围查询。全文索引:全文索引通常基于倒排索引(Inverted Index)结构,它将文本中的单词映射到包含这些单词的文档列表。...它适用于精确匹配和范围查询,但不适用于文本搜索。全文索引:全文索引优化了基于文本的搜索操作,可以快速找到包含特定关键词的文档。它适用于文本搜索,但不适用于精确匹配和范围查询。
现在让我们一个接一个地转到每个全文查询。 1.匹配查询 我们在之前的博客中讨论了匹配查询,但是没有提到匹配查询的正常用例。...现在在上面的示例中,我们只看到了一个单词。当我们输入多个单词时会发生什么?...假设我们有一个搜索关键字“ Giffords family”,可以在“名称”和“描述”字段中进行搜索,则可以使用多重匹配查询。...它与匹配查询类似,但此处搜索关键字的格式很重要。它需要特定的格式,并且如果搜索关键字的格式不同,则会返回错误。...在下面给出的示例中,match_phrase查询以相同顺序获取与单词“ deeply关心”匹配的文档。
你能看出NLTK是如何将句子分解为单个单词并说明其词性,如('fox','NN'): NN noun, sigular 'fox' 停用词删除 许多句子和段落都包含一些几乎无实际意义的单词,包括“a”,...词干提取 词干化是减少单词噪声的过程,也被称为词典归一化。它减少了单词的变化。例如,单词“fishing”的词干为“fish”。 词干化用于将单词简化到其基本含义。...另一个很好的例子是“喜欢”这个词,它是许多单词的词干,如:“likes”,“liked”和“likely”。 搜索引擎也是使用词干的。...在许多情况下,用这种方法来搜索其中一个单词以返回包含该集合中另一个单词的文档可能是非常有用的。...例如单词'saw',词干化返回'saw',词形归并返回'see'和'saw'。词形归并通常会返回一个可读的单词,而词干化可能不会。可以看下面的一个示例以了解差异。
领取专属 10元无门槛券
手把手带您无忧上云