您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)將唐詩(shī)三百首寫入 Elasticsearch 會(huì)發(fā)生什么,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
將唐詩(shī)三百首寫入Elasticsearch會(huì)發(fā)生什么?
此項(xiàng)目是根據(jù)實(shí)戰(zhàn)項(xiàng)目濃縮的一個(gè)小項(xiàng)目,幾乎涵蓋之前講解的所有知識(shí)點(diǎn)。
通過(guò)這個(gè)項(xiàng)目的實(shí)戰(zhàn),能讓你串聯(lián)起之前的知識(shí)點(diǎn)應(yīng)用于實(shí)戰(zhàn),并建立起需求分析、整體設(shè)計(jì)、數(shù)據(jù)建模、ingest管道使用、檢索/聚合選型、kibana可視化分析等的全局認(rèn)知。
數(shù)據(jù)來(lái)源:https://github.com/xuchunyang/300
注意數(shù)據(jù)源bug: 第1753行種的"id":178 需要手動(dòng)改成 "id": 252。
注意:
注意:
檢索分析DSL實(shí)戰(zhàn)
聚合分析實(shí)戰(zhàn)及可視化實(shí)戰(zhàn)
本著:編碼之前,設(shè)計(jì)先行的原則。
開(kāi)發(fā)人員的通病——新的項(xiàng)目拿到需求以后,不論其簡(jiǎn)單還是復(fù)雜,都要先梳理需求,整理出其邏輯架構(gòu),優(yōu)先設(shè)計(jì),以便建立全局認(rèn)知,而不是上來(lái)就動(dòng)手敲代碼。
本項(xiàng)目的核心知識(shí)點(diǎn)涵蓋如下幾塊內(nèi)容
有圖有真相。
根據(jù)需求梳理出如下的邏輯架構(gòu),實(shí)際開(kāi)發(fā)中要謹(jǐn)記如下的數(shù)據(jù)流向。
之前也有講述,這里再?gòu)?qiáng)調(diào)一下數(shù)據(jù)建模的重要性。
數(shù)據(jù)模型支撐了系統(tǒng)和數(shù)據(jù),系統(tǒng)和數(shù)據(jù)支撐了業(yè)務(wù)系統(tǒng)。
一個(gè)好的數(shù)據(jù)模型:
對(duì)于Elasticsearch的數(shù)據(jù)建模的核心是Mapping的構(gòu)建。
對(duì)于原始json數(shù)據(jù):
"id": 251, "contents": "打起黃鶯兒,莫教枝上啼。啼時(shí)驚妾夢(mèng),不得到遼西。", "type": "五言絕句", "author": "金昌緒", "title": "春怨"
我們的建模邏輯如下:
字段名稱 | 字段類型 | 備注說(shuō)明 |
---|---|---|
_id | 對(duì)應(yīng)自增id | |
contents | text & keyword | 涉及分詞,注意開(kāi)啟:fielddata:true |
type | text & keyword | |
author | text & keyword | |
title | text & keyword | |
timestamp | date | 代表插入時(shí)間 |
cont_length | long | contents長(zhǎng)度, 排序用 |
由于涉及中文分詞,選型分詞器很重要。
這里依然推薦:選擇ik分詞。
ik詞典的選擇建議:自帶詞典不完備,網(wǎng)上搜索互聯(lián)網(wǎng)的一些常用語(yǔ)詞典、行業(yè)詞典如(詩(shī)詞相關(guān)詞典)作為補(bǔ)充完善。
創(chuàng)建:indexed_at 的管道,目的:
PUT _ingest/pipeline/indexed_at{ "description": "Adds timestamp to documents", "processors": [ { "set": { "field": "_source.timestamp", "value": "{{_ingest.timestamp}}" } }, { "script": { "source": "ctx.cont_length = ctx.contents.length();" } } ]}
如下DSL,分別構(gòu)建了模板:my_template。
指定了settings、別名、mapping的基礎(chǔ)設(shè)置。
模板的好處和便捷性,在之前的章節(jié)中有過(guò)詳細(xì)講解。
PUT _template/my_template
{
"index_patterns": [
"some_index*"
],
"aliases": {
"some_index": {}
},
"settings": {
"index.default_pipeline": "indexed_at",
"number_of_replicas": 1,
"refresh_interval": "30s"
},
"mappings": {
"properties": {
"cont_length":{
"type":"long"
},
"author": {
"type": "text",
"fields": {
"field": {
"type": "keyword"
}
},
"analyzer": "ik_max_word"
},
"contents": {
"type": "text",
"fields": {
"field": {
"type": "keyword"
}
},
"analyzer": "ik_max_word",
"fielddata": true
},
"timestamp": {
"type": "date"
},
"title": {
"type": "text",
"fields": {
"field": {
"type": "keyword"
}
},
"analyzer": "ik_max_word"
},
"type": {
"type": "text",
"fields": {
"field": {
"type": "keyword"
}
},
"analyzer": "ik_max_word"
}
}
}
}
PUT some_index_01
通過(guò)如下的python代碼實(shí)現(xiàn)。注意:
def read_and_write_index():
# define an empty list for the Elasticsearch docs
doc_list = []
# use Python's enumerate() function to iterate over list of doc strings
input_file = open('300.json', encoding="utf8", errors='ignore')
json_array = json.load(input_file)
for item in json_array:
try:
# convert the string to a dict object
# add a new field to the Elasticsearch doc
dict_doc = {}
# add a dict key called "_id" if you'd like to specify an ID for the doc
dict_doc["_id"] = item['id']
dict_doc["contents"] = item['contents']
dict_doc["type"] = item['type']
dict_doc["author"] = item['author']
dict_doc["title"] = item['title']
# append the dict object to the list []
doc_list += [dict_doc]
except json.decoder.JSONDecodeError as err:
# print the errors
print("ERROR for num:", item['id'], "-- JSONDecodeError:", err, "for doc:", dict_doc)
print("Dict docs length:", len(doc_list))
try:
print ("\nAttempting to index the list of docs using helpers.bulk()")
# use the helpers library's Bulk API to index list of Elasticsearch docs
resp = helpers.bulk(
client,
doc_list,
index = "some_index",
doc_type = "_doc"
)
# print the response returned by Elasticsearch
print ("helpers.bulk() RESPONSE:", resp)
print ("helpers.bulk() RESPONSE:", json.dumps(resp, indent=4))
except Exception as err:
# print any errors returned w
## Prerequisiteshile making the helpers.bulk() API call
print("Elasticsearch helpers.bulk() ERROR:", err)
quit()
GET some_index/_search
{
"query": {
"match": {
"contents": "銘"
}
}
}
GET some_index/_search
{
"query": {
"match": {
"contents": "毅"
}
}
}
GET some_index/_search
{
"query": {
"match": {
"contents": "天下"
}
}
}
實(shí)踐表明:
不禁感嘆:唐詩(shī)先賢們也是心懷天下,憂國(guó)憂民??!
POST some_index/_search
{
"query": {
"match_phrase": {
"author": "李白"
}
},
"sort": [
{
"cont_length": {
"order": "desc"
}
}
]
}
POST some_index/_search
{
"aggs": {
"genres": {
"terms": {
"field": "author.keyword"
}
}
}
}
唐詩(shī)三百首中,李白共33首詩(shī)(僅次于杜甫39首),最長(zhǎng)的是“蜀道難”,共:353 個(gè)字符。
李白、杜甫不愧為:詩(shī)仙和詩(shī)圣??!也都是高產(chǎn)詩(shī)人!
POST some_index/_search
{
"sort": [
{
"cont_length": {
"order": "desc"
}
}
]
}
POST some_index/_search
{
"sort": [
{
"cont_length": {
"order": "asc"
}
}
]
}
最長(zhǎng)的詩(shī):白居易-長(zhǎng)恨歌-960個(gè)字符。
最短的詩(shī):王維-鹿柴- 24個(gè)字符(并列的非常多)。
以下的截圖通過(guò)kibana實(shí)現(xiàn)。細(xì)節(jié)在之前的kibana可視化中都有過(guò)講解。
以上就是將唐詩(shī)三百首寫入 Elasticsearch 會(huì)發(fā)生什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。