当查看索引里的数据,我们意识到一些奇怪的东西。
有些事情看起来有问题,我们在索引里有12个tweets,只有1个包含date 2014-09-15
现在让我们看看这些查询。
GET /_search?q=2014 # 12 results
GET /_search?q=2014-09-15 # 12 results !
GET /_search?q=date:2014-09-15 # 1 result
GET /_search?q=date:2014 # 0 results !
PS:如果你看了上一篇文章,你就知道哪个查询用了_all字段,哪个查询没有用这个字段。
为什么会有这些差别?
可能是因为_all索引数据的方式不同于date字段索引数据的方式。
让我们看一看es如何解释我们的文档结构,这是通过请求gb索引的tweet type的mapping信息。
GET /gb/_mapping/tweet
结果如下:
{
"gb"
: {
"mappings"
: {
"tweet"
: {
"properties"
: {
"date"
: {
"type"
:
"date"
,
"format"
:
"dateOptionalTime"
},
"name"
: {
"type"
:
"string"
},
"tweet"
: {
"type"
:
"string"
},
"user_id"
: {
"type"
:
"long"
}
}
}
}
}
}
es已经为我们自动创建了mapping.当然,这是它自己猜测的。
响应告诉我们date域已经被识别为date类型,
_all字段没有提及是因为它是一个默认字段,当然了,我们知道_all字段是string类型。
这样,日期类型的字段和字符串类型的字段的索引方式是不同的,因为寻找过程也是不同的。
一点也不奇怪。
也许,你希望核心类型:strings,number,booleans,dates都以不同的方式索引,而且事实上,它们之间确实有细微差别。
但是,目前为止,最大的差别在于表示具体值的字段和表示全文的字段之间。
这个区别很重要,这是es跟其它数据的区别之一。
http://my.oschina.net/qiangzigege/blog/264662
数据类型可以分为2类:具体值和全文。
具体值,比如说日期或者一个用户ID,也可以包括具体的字符串比如用户名或者邮箱。
具体值
"Foo"
与具体值
"foo"
不同.
具体值2014 与具体值2014-09-15也不同.
全文,引用文本内容,比如tweet的文本或者email的内容。
全文通常理解为非结构化数据,问题是:自然语言的规则复杂,计算机难以解析,比如,考虑到以下句子:
May is fun but June bores me.
这是说月份还是人?
具体值就容易查询,一个值要么匹配查询要么不匹配。
用SQL表达如下:
WHERE name =
"John Smith"
AND user_id = 2
AND
date
>
"2014-09-15"
查询全文的数据就更微妙,
我们不仅仅问文档是否匹配查询,还要知道文档与查询有多匹配,
换句话来说,相关度如何?
很少情况下,我们想完全匹配文本段,而是在文本域里搜索,我们还希望搜索能够理解我们的意图。
一个针对于
"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"
应该返回
"news stories about fox hunting"
有关的。
为了让这些全文字段的搜索便利,es首先分析文本,然后使用结果来建立倒排索引,
我们将讨论倒排索引和分析过程。
http://my.oschina.net/qiangzigege/blog/264761