1. 大家好,这里是老杨玩搜索。本日来聊一下 Easysearch 的全文检索。按照操持,本日是全文检索。
2. 这里列出了 3 个 SQL,第一个是精确的搜索,后面两个是模糊匹配。全文检索跟这上面的 3 个语句有什么差异?先来聊一下全文检索底层的技能。
3. 首先是分词器。分词器的浸染是会把文档的内容还有搜索的内容做一个加工。里面一共分为三个组件。

- 第一个是 Character filter。它是做提前的处理,可以帮你去除一些不想要的标签,比如 html 的一些标签。第一个写了去除杂质,不想要的东西可以首先通过组件去去除。如果有一些自己的映射,比如有些比较故意义的字符串,可以进行转换。这里列出了 xxx,可以转换成一些其他什么的。组件还有个特点,便是它并不是必备的组件,还有一些分词器里面就没有组件。
- 第二个组件是 Tokenizer。Tokenizer 紧张是把内容进行分词的处理,分成多少个词,这个是分词器的核心,以是组件是必备的,而且只能有一个。
- 第三个组件是 Token filters。Token filters 可以有 0 个或多个,便是对分完词之后再对内容、对 term 进行进一步的处理。比如如果是英文的,可能是大小写转换;中文的,可能是简繁体转换。还有一些非常常用的量词,不是那么故意义的,比如分词器/anay 可以把它给去掉,可以加到停用词的里面去。还有同义词,也是在这个部分去添加的。这个便是分词器的里面的技能。
4. 最近我还列出了三点,便是首先全文检索支持的字段是 text 字段,只有这个字段才能有这个功能,然后可以去配置一个分词器。如果没有去配置分词器,ES 是会帮你去默认的指定 standard 的分词器。standard 分词器是专门针对英文的,它因此空格去做词的切分。
5. 全文检索搜索的返回的结果就不像以前的 SQL 是“包含”或者“不包含”,“即是”“不即是”这种关系,它是打算一个相似度去返回一个最相似的构造级,便是以相似度倒排。右边这个部分有一个索引的配置示例,看这里 content 是 text 的类型。
6. 这里分开的设置了两个 analyzer,比如内容写进去的时候用的是 ik_max_word,搜索的时候内容用的 ik_smat,这两个平时可以设置成一样,也可以设置成不一样,这里可以轻微的点一下。
7. 这里一样平常 ES 可以通过 analyze 这个 API 去看一下内部是如何对内容去做分词的。这里可以先指定须要利用的分词器,然后指定一下内容,去看这些分词器是如何去做分词的。
8. 来演示一下,比如第一个是 standard 的分词器,它刚讲过是对英语的,以是看它就简大略单的就把每个字都分成一个 term,这很明显在中文的语系里面是不得当的。看这个,第一它有非常稀碎的这种,又有非常多的比如说多达四个字的这种很长的 term,国人、中国,这个就极尽可能的去帮我们去剖析更多的情形。smart 它便是说最常用的场景,最大的可能性是哪个?它便是以这种 smart 模式帮你去做分词的。它们两个有什么特点?这个可能便是可以覆盖更多的场景,更多的情形,但是它花费的空间当然也是会多一些的,由于 term 会更多。这个便是说它是一个最常用的场景,一样平常也可能就够用了,如果不足用可以切换成这个。当然它们两个也可以结合起来一起用。刚刚我们的例子也说了,便是说文档内容可以用这种可能性最丰富的分词器去做,然后搜索的内容可以去按一个最常用的分词器来去做一个分词。
9. 经由这一番讲解,相信大家知道了全文检索是一个什么检索?这我们牢记,便是说它是一个不是“是”或者“不是”的结果,它是一个相似度的结果,而且它的底层技能便是分词器的技能。
10. OK.感谢大家的不雅观看。