目录
1、数据类型差异
2、确切值 与 全文文本
3、倒排索引
映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型。
分析(analysis)机制用于进行全文文本的分词,以建立供搜索用的反向索引。
1、数据类型差异
对blog类型进行 _mapping,得到文档字段类型:
curl -XGET 'http://10.24.54.241:9200/website/_mapping/blog/?pretty'
结果:
{
"website" : {
"mappings" : {
"blog" : {
"properties" : {
"date" : {
"type" : "date",
"format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
},
"tags" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"te4t" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"text" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"views" : {
"type" : "long"
}
}
}
}
}
}
Elasticsearch 对对字段类型进行猜测,自动生成了字段和类型的映射关系。
2、确切值 与 全文文本
Elasticsearch 中的数据可以大致分为两种类型:
1. 确切值:确切值是确定的,例如 “Foo” 和 “foo” 就并不相同。
2. 全文文本:文本化的数据,比如文章或邮件正文,常被称为 非结构化数据 。
确切值是很容易查询的,因为结果是二进制的 —— 要么匹配,要么不匹配。
而对于全文数据的查询,却有些微妙。我们不会去询问 这篇文档是否匹配查询要求?。而会询问 这篇文档和查询的匹配度如何?
。换句话说,对于查询条件,这篇文档的相关性有多高?
+
我们很少确切的匹配整个全文文本。我们想在全文中查询包含查询文本的部分。不仅如此,我们还期望搜索引擎能理解我们的意图:
- 一个针对
"UK"
的查询将返回涉及"United Kingdom"
的文档 - 一个针对
"jump"
的查询同时能够匹配"jumped"
,"jumps"
,"jumping"
甚至"leap"
"johnny walker"
也能匹配"Johnnie Walker"
,"johnnie depp"
及"Johnny Depp"
"fox news hunting"
能返回有关hunting on Fox News的故事,而"fox hunting news"
也能返回关于fox hunting的新闻故事。
为了方便在全文文本字段中进行这些类型的查询,Elasticsearch首先对文本分析(analyzes),然后使用结果建立一个倒排索引。
3、倒排索引
Elasticsearch 使用一种叫做 倒排索引的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列表,以及对于每个单词在文档中的位置组成。