您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關將唐詩三百首寫入 Elasticsearch 會發生什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
將唐詩三百首寫入Elasticsearch會發生什么?
此項目是根據實戰項目濃縮的一個小項目,幾乎涵蓋之前講解的所有知識點。
通過這個項目的實戰,能讓你串聯起之前的知識點應用于實戰,并建立起需求分析、整體設計、數據建模、ingest管道使用、檢索/聚合選型、kibana可視化分析等的全局認知。
數據來源:https://github.com/xuchunyang/300
注意數據源bug: 第1753行種的"id":178 需要手動改成 "id": 252。
注意:
注意:
檢索分析DSL實戰
聚合分析實戰及可視化實戰
本著:編碼之前,設計先行的原則。
開發人員的通病——新的項目拿到需求以后,不論其簡單還是復雜,都要先梳理需求,整理出其邏輯架構,優先設計,以便建立全局認知,而不是上來就動手敲代碼。
本項目的核心知識點涵蓋如下幾塊內容
有圖有真相。
根據需求梳理出如下的邏輯架構,實際開發中要謹記如下的數據流向。
之前也有講述,這里再強調一下數據建模的重要性。
數據模型支撐了系統和數據,系統和數據支撐了業務系統。
一個好的數據模型:
對于Elasticsearch的數據建模的核心是Mapping的構建。
對于原始json數據:
"id": 251, "contents": "打起黃鶯兒,莫教枝上啼。啼時驚妾夢,不得到遼西。", "type": "五言絕句", "author": "金昌緒", "title": "春怨"
我們的建模邏輯如下:
字段名稱 | 字段類型 | 備注說明 |
---|---|---|
_id | 對應自增id | |
contents | text & keyword | 涉及分詞,注意開啟:fielddata:true |
type | text & keyword | |
author | text & keyword | |
title | text & keyword | |
timestamp | date | 代表插入時間 |
cont_length | long | contents長度, 排序用 |
由于涉及中文分詞,選型分詞器很重要。
這里依然推薦:選擇ik分詞。
ik詞典的選擇建議:自帶詞典不完備,網上搜索互聯網的一些常用語詞典、行業詞典如(詩詞相關詞典)作為補充完善。
創建: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,分別構建了模板:my_template。
指定了settings、別名、mapping的基礎設置。
模板的好處和便捷性,在之前的章節中有過詳細講解。
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
通過如下的python代碼實現。注意:
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": "天下"
}
}
}
實踐表明:
不禁感嘆:唐詩先賢們也是心懷天下,憂國憂民啊!
POST some_index/_search
{
"query": {
"match_phrase": {
"author": "李白"
}
},
"sort": [
{
"cont_length": {
"order": "desc"
}
}
]
}
POST some_index/_search
{
"aggs": {
"genres": {
"terms": {
"field": "author.keyword"
}
}
}
}
唐詩三百首中,李白共33首詩(僅次于杜甫39首),最長的是“蜀道難”,共:353 個字符。
李白、杜甫不愧為:詩仙和詩圣啊!也都是高產詩人!
POST some_index/_search
{
"sort": [
{
"cont_length": {
"order": "desc"
}
}
]
}
POST some_index/_search
{
"sort": [
{
"cont_length": {
"order": "asc"
}
}
]
}
最長的詩:白居易-長恨歌-960個字符。
最短的詩:王維-鹿柴- 24個字符(并列的非常多)。
以下的截圖通過kibana實現。細節在之前的kibana可視化中都有過講解。
以上就是將唐詩三百首寫入 Elasticsearch 會發生什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。