Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。
一个倒排索引由文档中全部不重复词的列表构成,对于其中每一个词,有一个包含它的文档列表。算法
假设咱们有两个文档,每一个文档的 content 域包含以下内容:ui
为了建立倒排索引,咱们首先将每一个文档的 content 域拆分红单独的 词(咱们称它为 词条 或 tokens ),建立一个包含全部不重复词条的排序列表,而后列出每一个词条出如今哪一个文档。结果以下所示:code
Term Doc_1 Doc_2 ------------------------- Quick | | X The | X | brown | X | X dog | X | dogs | | X fox | X | foxes | | X in | | X jumped | X | lazy | X | X leap | | X over | X | X quick | X | summer | | X the | X | ------------------------
如今,若是咱们想搜索 quick brown ,咱们只须要查找包含每一个词条的文档:排序
Term Doc_1 Doc_2 ------------------------- brown | X | X quick | X | ------------------------ Total | 2 | 1
两个文档都匹配,可是第一个文档比第二个匹配度更高。若是咱们使用仅计算匹配词条数量的简单 类似性算法 ,那么,咱们能够说,对于咱们查询的相关性来说,第一个文档比第二个文档更佳。索引
可是,咱们目前的倒排索引有一些问题:token
使用前面的索引搜索 +Quick +fox 不会获得任何匹配文档。(记住,+ 前缀代表这个词必须存在。)只有同时出现 Quick 和 fox 的文档才知足这个查询条件,可是第一个文档包含 quick fox ,第二个文档包含 Quick foxes 。文档
咱们的用户能够合理的指望两个文档与查询匹配。咱们能够作的更好。ast
若是咱们将词条规范为标准模式,那么咱们能够找到与用户搜索的词条不彻底一致,但具备足够相关性的文档。例如:搜索
如今索引看上去像这样:查询
Term Doc_1 Doc_2 ------------------------- brown | X | X dog | X | X fox | X | X in | | X jump | X | X lazy | X | X over | X | X quick | X | X summer | | X the | X | X ------------------------