嚴選 | Elastic中文社區201903錯題本

題記html

馬雲演講中曾經提到:不少時候少聽成功專家的話。全部的創業者多花點時間學習別人是怎麼失敗的,由於成功的緣由有千千萬萬,失敗的緣由就一兩個點。java

創業須要關注別人的失敗,而開發實戰,別人的錯誤經驗、別人的問題也很是有價值。es6

開發最懊悔的事莫過於:本身費盡腦汁、花費了很長時間解決了問題,原來別人在社區或者別的地方早已經給出了更優化的方案。redis

開發最最懊悔的事莫過於:別人已經給出了方案,可是咱們仍然在黑暗中苦逼的摸索。sql

所以,我從2018年4月——至今,每個月都會梳理出了Elastic中文社區的精華乾貨——簡稱:Elastic錯題本, 問題大多來自Medcl、wood大叔等大牛的精彩回覆,結合實戰嚴選的核心問題。express

放在了GitHub上。服務器

GitHub地址:http://t.cn/EibZipU數據結構

目的:提早加深認知,少重複走別人的彎路!多線程

一、Elasticsearch
1.1 如何清理Elasticsearch特定時間段數據?
1) Elasticsearch 6.6+新推出了一個 ILM 的功能,Index Lifecycle Management 的功能,在Kibana 界面裏面就能夠直接配置索引的保留時間和過時策略。 上一次錯題本也說起社區彬哥的分享:https://elasticsearch.cn/article/6358併發

2) es5.0提供了 Rollover 特性

https://elasticsearch.cn/question/1094

1.2 可否在一個查詢中 查詢兩個條件 在對兩個結果進行除法計算?
請教各位一個問題,咱們有一個場景,想經過1個查詢語句,計算兩個查詢結果的除法, 好比,我有一個查詢條件,用 idc: "BJ" 能統計出有100條數據符合要求 , 第二個條件 idc: "SH",能統計出有200個數據,我如今想要取到 100 / 200 這個值 50% 這個數據, 請問能有辦法實現嗎?

#參考 es6.6版本

PUT test01_index
/
_doc
/
5

{

"x_value"
:
15
,

"y_value"
:
3

}

POST test01_index
/
_doc
/
_search

{

"script_fields"
:

{

"my_divide_field"
:

{

"script"
:

{

"lang"
:

"expression"
,

"source"
:

"doc['y_value'].value != 0 ? doc['x_value'].value / doc['y_value'].value : 0"

}

}

}

}

1.3 ngram分詞器會佔不少內存嗎?
ngram分詞分的很細,會不會致使較多的內存佔用?當數據量較大時,是否有瓶頸??

【回覆】ngram分詞分的很細會產生較多的 term ,所以會比普通使用詞典分詞的佔用更多的存儲和內容; 數據量大的時候,可經過分索引和多分片來分散壓力。

1.4 自定義id帶來的問題
問題描述:咱們目前業務使用了自定義id,md5(uid+someid), 目的是爲了再次更新方便。可是這樣有兩個問題,

這種隨機的自定義id,壓縮比很低,空間佔用高。

指定id bulk index 的時候,es 會先判斷 id 是否存在,而後再插入。這樣隨着數據量的增長,性能持續降低。 不知道你們有什麼好辦法,對應這種須要持續更新的數據。 數據量還挺大的。

官網建議:若是使用了自動生成id,每次導入數據的時候都要進行id的檢查。這裏是有性能消耗的。可是使用隨機生成id,就不須要這一步。 官網地址:http://t.cn/Ei47gY0 討論建議:

id的生成策略儘可能是對壓縮友好的,避免過於隨機,好比按序生成

想到一點減少id是否存在的判斷成本,是否考慮使用 路由,至關於指定了插入doc所在的shard,減小判斷是否存在的數據量

1.5 關於 ik 新詞更新
想作新詞發現,更新詞庫,可是搞不清es對於這種更新詞庫後,老數據怎麼處理爲好

建議:不影響搜索的話,重建索引,reindex ,而後別名切換過去。 緣由:ES數據寫入的過程便是索引化的過程,這個階段會按照設定的分詞進行數據索引化。因此,必須reindex重建索引或者從新導入數據才能生效。

1.6 es有沒可能同時寫多個索引?
有舊有數據的同步問題的困擾,須要相似數據雙寫的操做,貌似直接設置同一個別名而後insert會報錯

alias 只能聲明一個索引爲寫活躍狀態,沒法多個同時寫入,不然會報錯。 或者用reindex 開始的時候你寫兩份就行啊,修改一份。

1.7 bulk寫入數據時,READ很是高
不管是index或者是update,只要指定了doc id,lucene都須要進行get操做,當你索引數據量很大時,會有頻繁且大量segment中的數據加載到內存,這是 read io高的一個大緣由, 另外一般merge 只要線程數限小,不會有很是高的read io,我以前也碰到過這個問題,本身探索了下 經覈實:確實是由於指定id引發的。

https://elasticsearch.cn/question/6526

1.8 增長索引個數能有效的提升寫入效率嗎?
如題, 如今ES集羣是一個索引在寫,後臺15臺物理機,48c,188G,是多線程同步寫一個索引,看監控能到40W,再加併發也提升不了,可是機器的負載和線程池資源都還OK,我看線程池是index級別的設定,能經過增長寫入索引個數來增長寫入性能吧,仍是說要擴容呢?

寫入及索引性能核心參考:http://t.cn/EibAIyb

網上全部的書籍、文檔基本都離不開連接給出的東西

1.9 Elasticsearch6.5.3全聚合出現與MySQL聚合結果不一致的問題
MySQL中的聚合語句:

select
sum
(
adv_price
)

from
report_2019_01
where
report_time

=
1546272000

and
report_time
<
1546358400
;

MySQL聚合結果是:11612.840

將上面時間的數據所有導入es中,並聚合:

"aggregations"
:

{

"revenue"
:

{

"sum"
:

{

"field"
:

"adv_price"

}

}

}

}

Elasticsearch聚合結果是:9064

緣由:浮點精度問題,相似相關問題都是浮點精度問題思路排查的。

1.10 如何對同一個字段進行不一樣的分詞
multi-fields 能夠實現,也就是說一個字段能夠設置多個子字段. 推薦視頻:https://elasticsearch.cn/article/13274

1.11 es禁止*刪除索引
一、永久修改——經過setting修改

PUT
/
_cluster
/
settings

{

"persistent"
:

{

"action.destructive_requires_name"
:

"true"

}

}

二、經過配置文件修改 建議經過1修改

1.12 怎樣限定es查詢返回數據最低分,低於XX分數的不要
min_score參數

SearchResponse
response

client
.
prepareSearch
(
INDEX_NAME
)

.
setTypes
(
TYPE_NAME
)

.
setQuery
(
queryBuilder
)

.
setMinScore
(
minScore
)

.
execute
()

.
actionGet
();

.
setMinScore
(
minScore
)

1.13 想問下多個terms查詢爲什麼不起做用,有沒有什麼解決辦法
https://elasticsearch.cn/question/7342 問題緣由:大小寫問題

默認的standard analyzer包含lowcase token filter, 會把大寫轉換爲小寫,,若是必定要使用大寫查詢的話,能夠自定義

1.14 關於translog和線程池拒絕
好比提交bulk,請求寫入了translog,可是因爲服務器壓力大,線程池拒絕了這個請求,那translog還有用嗎?

回覆:寫translog是在寫內存以後纔會發生,若是出現拒絕是連內存還沒寫入就拒絕了,遠沒有到寫translog, 能夠看看這篇文章:https://zhuanlan.zhihu.com/p/34669354

1.15 es search爲啥不用bloom filter?
首先你須要瞭解布隆過濾器的用途,通常是用於字符串或者數字等,檢測是否存在的場景,例如:爬蟲的 URL 去重;

ES 的查詢,大部分場景是看某個文本是否存在與某篇文檔中;或者日期、數字等是否在某個範圍; 因此應用的方向不一樣,所以 ES 使用了倒排索引、KD數等其餘數據結構實現了搜索

1.16 將文檔存儲在es外面,同時使es搜索結果只返回文檔基本信息,這樣作可否提升性能?
問題描述:
就是說,若是文檔比較大,es把它做爲搜索結果整個返回的時候,可能對es性能形成壓力。 因此一個天然的想法就是,index時把文檔整個存進es,同時把文檔另存一份在其餘專用的靜態存儲空間中,query時使es只返回文檔基本信息,如id、timestamp等,再經過id來找到靜態存儲空間中的相應文檔。 這樣子可否對es性能有較大提高,實際應用中這樣的使用模式多很少呢?

wood大叔回覆:若是文檔都很是大,靜態存儲方案廉價,能按照id,timestamp快速fetch回數據,那麼這種方案何嘗不可。 可是複雜性方面比所有放ES要高一些,應用層面多了一個依賴,也享受不到某些原生的ES特性,好比reindex。再就是靜態存儲一般也要是分佈式的,維護也有成本。因此你仍是要評估一下用 靜態存儲的話能省多少硬件,若是免得很少,還不如將文檔所有放ES裏簡單直接。

bsll:理論上是能夠的,用過es+hbase, es+couchbase的案例,不過樓上說的很對,得根據你的實際狀況來。

1.17 sql中的 is null 和 is not null 在Elasticsearch的應用
建議源頭出發,定義NULL.

PUT my_index

{

"mappings"
:

{

"_doc"
:

{

"properties"
:

{

"status_code"
:

{

"type"
:

"keyword"
,

"null_value"
:

"NULL"

}

}

}

}

}

1.18 elasticsearch 刪除不用的索引 怎麼真正釋放磁盤空間?
好比 我建立了 course1 course2 course3 這些都是測試建立的索引 可是我用curl -XDELETE http://192.168.1.113:9200/course1 這樣的命令將course1 2 3 分別刪除 可是在 elasticsearch data 目錄下文件並未釋放磁盤空間 怎麼操做才能刪除以前不用的索引並釋放磁盤空間呢 謝謝!!

解決方案:探究 | Elasticsearch如何物理刪除給按期限的歷史數據?

2 Logstash
2.1 logstash 批量接收數據
在logstash 中有沒有辦法使用 avro 接收數據,或者有沒有其餘方案可以接收flume 的avro sink 發來的數據

實現:

input
{

kafka
{

codec

=>
avro
{

schema_uri

=>

"/tmp/schema.avsc"

}

}

}

filter
{

...

}

output
{

...

}

https://www.elastic.co/guide/en/logstash/current/plugins-codecs-avro.html

2.2 logstash中添加fielter grok以後怎麼過濾多餘的字段
保留message字段 參考以下:

filter
{

grok
{

remove_field

=>

[

"foo_%{somefield}"
,

"my_extraneous_field"

]

}

}

2.3 logstash和es的template
問題描述:
logstash和es都指定了索引的模板, 那logstash採集數據到es時,以哪一個模板爲準呢

回覆:兩個模板會merge, 若是兩個模板有相同的配置項,以模板order大的爲準,不一樣的配置項則都會生效;建議設置一個單獨的模板就好了,多個模板可能有問題。 建議:實際場景驗證一下。

2.4 logstash數據監聽
問題描述:
redis中的數據經過logstash直接入庫到elasticsearch,項目使用的語言是java,目前的狀況是,須要在elasticsearch中一有新數據,就要作一些其餘的操做,不知道有沒有什麼方案,相似監聽elasticsearch數據是否更新、增長的機制來實現

解決方案:elasticsearch alert有相似功能,能夠看一下。

三、Kibana
3.1 Kibana中有幾個Dashboard,能否對每一個Dashboard分配權限,使其可以開放給指定人羣瀏覽?
space的出現的目的就是相同公司不一樣部門實現不一樣權限的。能夠參考。

3.2 kibana dev tools中文輸入有問題
這是kibana低版本的bug,高版本已經修復。kibana6.6已經不存在。

問題來源:Elastic中文社區

涉及問題均爲Elastic實踐場景的問題以及各位大牛的精彩回覆。

相關文章
相關標籤/搜索