ElasticSearch 型別對映

2021-09-02 08:34:10 字數 2997 閱讀 2848

當檢視索引裡的資料,我們意識到一些奇怪的東西。

有些事情看起來有問題,我們在索引裡有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

anddate>"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...