3.4.2.Elasticsearch基础应用
3.4.2.1.inverted index,doc_values,store及source
创作人:欧阳楚才
倒排索引
Elasticsearch 使用一种称为倒排索引的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
假设我们有两个文档,每个文档的正文字段包含如下内容:
1、The quick brown fox jumped over the lazy dog
2、Quick brown foxes leap over lazy dogs in summer
为了创建倒排索引,我们首先将每个文档的正文字段,拆分成单独的词(我们称它为词条或
Tokens),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。
结果如下所示:
现在,如果我们想搜索 Quick brown,我们只需要查找包含每个词条的文档:
两个文档都匹配,但是第一个文档比第二个匹配度更高。如果我们使用,仅计算匹配词条数量的简单相似性算法,那么我们可以说,对于我们查询的相关性来讲,第一个文档比第二个文档更佳。
但是,我们目前的倒排索引有一些问题:
使用前面的索引搜索 + Quick + fox 不会得到任何匹配文档。(记住,+ 前缀表明这个词必须存在)只有同时出现 Quick 和 fox 的文档才满足这个查询条件,但是第一个文档包含 quick
fox,第二个文档包含 Quick foxes。
我们的用户可以合理的期望两个文档与查询匹配,我们可以做的更好。
如果我们将词条规范为标准模式,那么我们可以找到与用户搜索的词条不完全一致,但具有足够相关性的文档,例如:
l Quick 可以小写化为 quick
l foxes 可以词干提取 -- 变为词根的格式 -- 为 fox。类似的,dogs 可以为提取为 dog
l jumped 和 leap 是同义词,可以索引为相同的单词 jump
现在索引看上去像这样:
l Quick 和 quick 以独立的词条出现,然而用户可能认为它们是相同的词。
l fox 和 foxes 非常相似,就像 dog 和 dogs,他们有相同的词根。
l jumped 和 leap,尽管没有相同的词根,但他们是同义词。
这还远远不够。我们搜索 +Quick +fox 仍然会失败,因为在我们的索引中,已经没有 Quick 了。但是,如果我们对搜索的字符串,使用与正文字段相同的标准化规则,会变成查询 +quick+fox,这样两个文档都会匹配。
PUT logs { "mappings": { "_source": { "includes": [ "*.count", "meta.*" ], "excludes": [ "meta.description", "meta.other.*" ] } } } PUT logs/_doc/1 { "requests": { "count": 10, "foo": "bar" }, "meta": { "name": "Some metric", "description": "Some metric description", "other": { "foo": "one", "baz": "two" } } } GET logs/_search { "query": { "match": { "meta.other.foo": "one" } } }
《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.1.inverted index,doc_values,store及source(2) https://developer.aliyun.com/article/1231137