一秒等于多少毫秒_使用kibana对电影一秒钟影评数据测试,详述配图演示如何使用收藏了...
前言: 越用越爽的docker值得你去體驗,企業搜索王者elasticsearch值得你去玩耍,流行的kibana值得你去探索,后續搭配的logstash用來同步數據更是助你一臂之力,原創不易,歡迎收藏。
本文將延續上篇文章:阿里云使用docker部署elasticsearch+kibana+ik全部搞定 講述如何使用kibana來操作elasticsearch。
1.準備階段
{
??"name":?"一秒鐘",
??"intro":?"影片講述了沒趕上電影場次的張九聲與劉閨女因一場電影結下了不解之緣的故事。",
??"releaseDate":?"2020-11-27",
??"director":?"張藝謀",
??"commentTime":?"2020-11-27",
??"voteCount":?3490,
??"hotComment":?"這根本就不是什么給電影的情書,整個電影沒有人是愛電影的。"
}
PUT?/movie_index/_doc/2?pretty
{
??"name":?"一秒鐘",
??"intro":?"主要敘事線結束“兩年后”是恢復高考,也就是1977年,倒推影片發生時間,就是1975年。",
??"releaseDate":?"2020-11-27",
??"director":?"張藝謀",
??"commentTime":?"2020-11-19",
??"voteCount":?2180,
??"hotComment":?"公映版的《一秒鐘》,刪去了非常重要的一個情節:張九聲的女兒,其實已經死了。"
}
PUT?/movie_index/_doc/3?pretty
{
??"name":?"一秒鐘",
??"intro":?"故事靈感來源于張藝謀導演早期經歷,是其一貫對文化展開追憶和尋根的風格",
??"releaseDate":?"2020-11-27",
??"director":?"張藝謀",
??"commentTime":?"2020-12-01",
??"voteCount":?1480,
??"hotComment":?"?張藝謀在進入新千年以后,最好的作品。"
}
PUT?/movie_index/_doc/4?pretty
{
??"name":?"一秒鐘",
??"intro":?"《一秒鐘》面子上講的是對膠片電影往事的緬懷,但骨子里卻是更直擊觀眾內心的時代悲劇與情感表達。",
??"releaseDate":?"2020-11-29",
??"director":?"張藝謀",
??"commentTime":?"2020-11-20",
??"voteCount":?809,
??"hotComment":?"如果這個結局是補拍的,那么可以說它徹底暴露了中宣部的智商,似乎他們在乎的只有那一句“時代變了”,而沒有察覺那兩幀找不回來的膠卷才是真正重要的東西。"
}
PUT?/movie_index/_doc/5?pretty
{
??"name":?"一秒鐘",
??"intro":?"導演對“膠片時代”一去不返的致敬,也是對“看電影”這件事細致入微的回憶與熱愛",
??"releaseDate":?"2020-11-27",
??"director":?"張藝謀",
??"commentTime":?"2020-11-19",
??"voteCount":?186,
??"hotComment":?"抱著中國版《天堂電影院》的期待來看的人,一定會大失所望。《一秒鐘》是寫給一個時代的挽歌,但不是寫給電影的情書"
}
插入記錄
2.簡易查詢
_search查詢
search API有兩種表單:一種是“簡易版”的查詢字符串(query string)將所有參數通過查詢字符串定義,另一種版本使用JSON完整的表示請求體(request body),這種富搜索語言叫做結構化查詢語句(DSL)
_search
這種查詢是將全文內容拼接成字符串,在字符串中尋找“情節”二字,從而找到包含這兩個字的記錄
GET?/movie_index/_search?q=hotComment:"情節"
_search?q=intro_search?q=hotComment
3.結構化查詢
term query會去倒排索引中尋找確切的term,它并不知道分詞器的存在,這種查詢適合keyword、numeric、date等明確值的。
GET?/movie_index/_search?pretty{
??"query":?{
????"term":?{
??????"hotComment":?"情節"
????}
??}
}
term-情節term-情
此時查詢查詢關鍵詞“情節”沒有獲得記錄,因為關鍵詞“情節”并不會進行分詞,是一個完整的詞,而hotComment中對應的內容的分詞采用的是默認分詞,分成的語句是一個個的漢字,如下:
GET?/_analyze{
??"text":?"公映版的《一秒鐘》,刪去了非常重要的一個情節:張九聲的女兒,其實已經死了。",
??"analyzer":?"chinese"
}
默認分詞
所以才會出現以上情況,后面我們再來演示ik分詞器的用法
對于返回結果中的部分字段解釋:
- hits
響應中最重要的部分是hits,它包含了total字段來表示匹配到的文檔總數,hits數組還包含了匹配到的前10條數據。hits數組中的每個結果都包含_index、_type和文檔的_id字段,被加入到_source字段中這意味著在搜索結果中我們將可以直接使用全部文檔。這不像其他搜索引擎只返回文檔ID,需要你單獨去獲取文檔。每個節點都有一個_score字段,這是相關性得分(relevance score),它衡量了文檔與查詢的匹配程度。默認的,返回的結果中關聯性最大的文檔排在首位;這意味著,它是按照_score降序排列的。這種情況下,我們沒有指定任何查詢,所以所有文檔的相關性是一樣的,因此所有結果的_score都是取得一個中間值1
max_score指的是所有文檔匹配查詢中_score的最大值。
- took
took告訴我們整個搜索請求花費的毫秒數。
- shards
_shards節點告訴我們參與查詢的分片數(total字段),有多少是成功的(successful字段),有多少的是失敗的(failed字段)。通常我們不希望分片失敗,不過這個有可能發生。如果我們遭受一些重大的故障導致主分片和復制分片都故障,那這個分片的數據將無法響應給搜索請求。這種情況下,Elasticsearch將報告分片failed,但仍將繼續返回剩余分片上的結果。
- timeout
time_out數值告訴我們查詢超時與否。一般的,搜索請求不會超時。如果響應速度比完整的結果更重要,你可以定義timeout參數為10或者10ms(10毫秒),或者1s(1秒)
{
??"query":?{
????"terms":?{
??????"hotComment":[?"情","作"]
????}
??}
}
terms
{
??"query":?{
????"match":?{
??????"hotComment":"情節"
????}
??}
}
match
使用match查詢可以成功獲得記錄,因為match query 知道分詞器的存在,會對field進行分詞操作,然后再查詢。
它和term區別可以理解為term是精確查詢,match模糊查詢;match會對“情節”分詞為兩個中文漢字,然后term會認為它是一個詞。
在上面3中的查詢結果中我們看到有3條匹配記錄,假如我們就是要查詢含有“情節”兩個字的記錄,可以配合operator進行使用
GET?/movie_index/_search?pretty{
??"query":?{
????"match":?{
??????"hotComment":?{
????????"query":?"情節",
????????"operator":?"and"
??????}
????}
??}
}
"operator": "and"
{
??"query":?{
????"match":?{
??????"hotComment":?{
????????"query":?"情節",
????????"operator":?"or"
??????}
????}
??},
??"highlight":?{
????"fields":?{
??????"hotComment":?{}
????}
??}
}
highlight
搜索結果中會將搜索字段對應的關鍵字進行高亮顯示(默認使用標簽)
你也可以使用自定義標簽
{
??"query":?{
????"match":?{
??????"hotComment":?{
????????"query":?"情節",
????????"operator":?"or"
??????}
????}
??},
??"highlight":?{
????"pre_tags":?[
??????""
????],"post_tags":?[""
????],
????"fields":?{
??????"hotComment":?{
????????"type":?"plain"
??????}
????}
??}
}
highlight
{
??"query":?{
????"match_all":?{}
??}
}
match_all
查詢"hotComment"或者"intro"字段含有”情節“關鍵字的記錄
GET?/movie_index/_search?pretty{
??"query":?{
????"multi_match":?{
??????"query":?"情節",
??????"fields":?[
????????"hotComment",
????????"intro"
??????]
????}
??}
}
multi_match
{
??"_source":["hotComment","intro"],
??"query":?{
????"multi_match":?{
??????"query":?"情節",
??????"fields":?[
????????"hotComment",
????????"intro"
??????]
????}
??}
}
_source
此時返回結果記錄中就只有指定的"hotComment"和"intro"字段了。
使用sort實現排序(類似sql):desc 降序,asc升序
{
??"query":?{
????"multi_match":?{
??????"query":?"情節",
??????"fields":?[
????????"hotComment",
????????"intro"
??????]
????}
??},
??"sort":?[
????{
??????"voteCount":?"desc"
????}
??]
}
sort
返回結果根據"voteCount"熱評字段數降序排序
4.ik分詞器的使用
下面我們對"情節"兩字使用ik分詞器進行查詢
{
??"query":?{
????"match":?{
??????"hotComment":?{
????????"query":?"情節",
????????"analyzer":"ik_max_word"
??????}
????}
??}
}
ik
我們對"情節"分詞看看結果
GET?/_analyze{
??"text":?[
????"情節"
??],
??"analyzer":?"ik_max_word"
}
分詞
可以看到使用ik_max_word分詞得到的是一個詞"情節"
通過以下命令查看查看索引映射方式
GET?/movie_index/_mapping查看映射
索引中的字段使用未設置分詞器,因此使用的是默認分詞,前面我們已經演示過分成的是單個的字符,所以這里匹配不上記錄。
新建索引 new_spitindex,索引時,為了提供索引的覆蓋范圍,通常會采用ik_max_word分析器,會以最細粒度分詞索引,搜索時為了提高搜索準確度,會采用ik_smart分析器,會以粗粒度分詞
PUT?/new_movie_index/{
??"settings":?{
????"number_of_shards":?5,
????"number_of_replicas":?1
??},
??"mappings":?{
????"properties":?{
??????"commentTime":?{
????????"type":?"date",
????????"format":?"yyyy-MM-dd?HH:mm:ss||yyyy-MM-dd||epoch_millis"
??????},
??????"releaseDate":?{
????????"type":?"date",
????????"format":?"yyyy-MM-dd?HH:mm:ss||yyyy-MM-dd||epoch_millis"
??????},
??????"director":?{
????????"type":?"keyword"
??????},
??????"hotComment":?{
????????"type":?"text",
????????"analyzer":?"ik_max_word",
????????"search_analyzer":?"ik_smart",
????????"fields":?{
??????????"keyword":?{
????????????"type":?"keyword",
????????????"ignore_above":?256
??????????}
????????}
??????},
??????"intro":?{
????????"type":?"text",
????????"analyzer":?"ik_max_word",
????????"search_analyzer":?"ik_smart",
????????"fields":?{
??????????"keyword":?{
????????????"type":?"keyword",
????????????"ignore_above":?256
??????????}
????????}
??????},
??????"name":?{
????????"type":?"text",
????????"analyzer":?"ik_max_word",
????????"search_analyzer":?"ik_smart",
????????"fields":?{
??????????"keyword":?{
????????????"type":?"keyword",
????????????"ignore_above":?256
??????????}
????????}
??????},
??????"voteCount":?{
????????"type":?"long"
??????}
????}
??}
}
新建索引
{
??"source":?{
????"index":?"movie_index"
??},
??"dest":?{
????"index":?"new_movie_index"
??}
}
reindex
刪除索引
查看索引查看索引
下面我們再次嘗試在新索引下進行檢索
{
??"query":?{
????"match":?{
??????"hotComment":?{
????????"query":?"情節",
????????"analyzer":"ik_smart"
??????}
????}
??}
}
此時是可以匹配記錄的。
{
??"query":?{
????"match":?{
??????"hotComment":?{
????????"query":?"愛電影",
????????"analyzer":"ik_smart"
??????}
????}
??}
}
一條記錄
以上查詢匹配出了兩條結果,因為"愛電影"在使用"ik_smart"分詞后,分成了兩個詞“愛”和“電影”。
如果想要將"愛電影"作為一個短語進行更精確的匹配,可以采用如下方式。
{
??"query":?{
????"match_phrase":?{
??????"hotComment":?{
????????"query":?"愛電影",
????????"analyzer":"ik_smart"
??????}
????}
??}
}
一條記錄
{
??"query":?{
????"match":?{
??????"intro":?{
????????"query":?"1976",
????????"analyzer":?"ik_smart"
??????}
????}
??}
}
1976
用戶將1975輸錯了成1976,此時是無法匹配結果,fuzzy查詢可以容錯。通過指定 fuzziness 參數為 1,Elasticsearch 支持最大的編輯距離為2。
fuzziness用來度量把一個單詞轉換為另一個單詞需要的單字符編輯次數 ((("Levenshtein distance"))). 他提出了3種單字符編輯:
- 替換?一個字符到另一個字符: _f_ox -> _b_ox
- 插入?一個新字符: sic -> sick
- 刪除?一個字符:: b_l_ack -> back
{
??"query":?{
????"match":?{
??????"intro":?{
????????"query":?"1976",
????????"analyzer":?"ik_smart",
????????"fuzziness":"1"
??????}
????}
??}
}
fuzzy查詢
filter是不計算相關性的,同時可以緩存。因此filter速度快于query。
下面查詢從所有結果中過來出"hotComment"字段含有"情書"的記錄
GET?/new_movie_index/_search{
??"query":?{
????"bool":?{
??????"filter":?{
????????"term":{
??????????"hotComment":"情書"
????????}
??????}
????}
??}
}
filter
bool查詢可以實現組合過濾查詢
格式:{"bool" : {"must":[],"should":[],"must_not":[] } }
- must: 必須滿足的條件 (相當于and)
- should: 可以滿足也可以不滿足的條件 (相當于or)
- must_not: 不需要滿足的條件 (相當于not)
下面查詢"hotComment"字段中含有"情書"或者"intro"字段含有"高考",并且"hotComment"字段中一定不能有"死了","intro"字段一定要有"熱愛"的記錄
GET?/new_movie_index/_search{
??"query":?{
????"bool":?{
??????"should":?[
????????{
??????????"term":?{
????????????"hotComment":?"情書"
??????????}
????????},
????????{
??????????"term":?{
????????????"intro":?"高考"
??????????}
????????}
??????],
??????"must_not":?[
????????{
??????????"term":?{
????????????"hotComment":?"死了"
??????????}
????????}
??????],
??????"must":?[
????????{
??????????"term":?{
????????????"intro":?"熱愛"
??????????}
????????}
??????]
????}
??}
}
一條匹配
gt:>
lt:<
gte:>=
lte:<=
下面查詢"hotComment"字段中含有"情書"或者"intro"字段含有"高考",并且"voteCount"值在[2180,3000]范圍的記錄
GET?/new_movie_index/_search{
??"query":?{
????"bool":?{
??????"must":?[
????????{
??????????"bool":?{
????????????"should":?[
??????????????{
????????????????"term":?{
??????????????????"hotComment":?"情書"
????????????????}
??????????????},
??????????????{
????????????????"term":?{
??????????????????"intro":?"高考"
????????????????}
??????????????}
????????????]
??????????}
????????},
????????{
??????????"range":?{
????????????"voteCount":?{
??????????????"gte":?2180,
??????????????"lte":?3000
????????????}
??????????}
????????}
??????]
????}
??}
}
匹配一條記錄
下面查詢"intro"字段中含有"故事" 并且從結果中過濾出"voteCount"值在[2000,+∞]范圍的記錄
GET?/new_movie_index/_search{
??"query":?{
????"bool":?{
??????"must":?[
????????{
??????????"match":?{
????????????"intro":?"故事"
??????????}
????????}
??????],
??????"filter":?{
????????"range":?{
??????????"voteCount":?{
????????????"gte":?2000
??????????}
????????}
??????}
????}
??}
}
時間范圍除了可以使用11中的語法外,也可以使用以下方式
GET?/new_movie_index/_search{
??"query":?{
????"bool":?{
??????"must":?[
????????{
??????????"match":?{
????????????"intro":?"故事"
??????????}
????????}
??????],
??????"filter":?{
????????"range":?{
??????????"commentTime":?{
????????????"from":?"2020-11-11",
????????????"to":"2020-11-30"
??????????}
????????}
??????}
????}
??}
}
range
5.可視化
除了以上操作外,kibana可以完成大量數據的統計分析。大家可以繼續探索。
例如我這里對微信公眾號的一些文章進行了簡單的圖形分析
數據分析下篇:logstash定時同步mysql數據到es--待更新
原創碼字不易,如果覺得這篇文章對你有作用,不妨點個贊或收藏一下吧( ^?^)
總結
以上是生活随笔為你收集整理的一秒等于多少毫秒_使用kibana对电影一秒钟影评数据测试,详述配图演示如何使用收藏了...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python standard lib_
- 下一篇: 为什么电网智慧工程首页没有了?