當檢視索引裡的資料,我們意識到一些奇怪的東西。
有些事情看起來有問題,我們在索引裡有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 !
為什麼會有這些差別?
可能是因為_all索引資料的方式不同於date欄位索引資料的方式。
結果如下:
,
"name"
: ,
"tweet"
: ,
"user_id"
:
}
}
}
}
}
響應告訴我們date域已經被識別為date型別,
_all欄位沒有提及是因為它是乙個預設字段,當然了,我們知道_all欄位是string型別。
這樣,日期型別的字段和字串型別的字段的索引方式是不同的,因為尋找過程也是不同的。
一點也不奇怪。
也許,你希望核心型別:strings,number,booleans,dates都以不同的方式索引,而且事實上,它們之間確實有細微差別。
但是,目前為止,最大的差別在於表示具體值的字段和表示全文的字段之間。
這個區別很重要,這是es跟其它資料的區別之一。
資料型別可以分為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首先分析文字,然後使用結果來建立倒排索引,
我們將討論倒排索引和分析過程。
elasticSearch 時間型別
elasticsearch原生支援date型別,結合該型別和kibana可以做出漂亮有用的圖表。這裡簡單記錄下使用的方法。使用date型別可以用如下兩種方式 使用毫秒的時間戳,直接將毫秒值傳入即可。date型別是包含時區資訊的,如果我們沒有在json代表日期的字串中顯式指定時區,對es來說沒什麼問題...
Elasticsearch 時間型別總結
elasticsearch 可以寫入 查詢不同的時間型別,但當遇到 unix 時間戳和其他時間格式的時候會有點混亂,因此本文主要是總結一下各種時間型別和其他的表示方式。json沒有日期型別,因此在 elasticsearch 中可以表達成 日期格式化的字串,比如 2015 01 01 或者 2015...
ElasticSearch 字段型別介紹
對elasticsearch稍有了解的人都知道,前者的字串被稱為not analyzed字元,而後者被稱作analyzed字串。text 會分詞,然後進行索引 支援模糊 精確查詢 不支援聚合 keyword 不進行分詞,直接索引 支援模糊 精確查詢 支援聚合 string型別在elasticsear...