當前位置:首頁 » 操作系統 » eskc演算法

eskc演算法

發布時間: 2023-07-02 19:02:30

㈠ 最小生成樹 普里姆演算法和克魯斯卡爾演算法

kruskal演算法的時間復雜度主要由排序方法決定,其排序演算法只與帶權邊的個數有關,與圖中頂點的個數無關,當使用時間復雜度為O(eloge)的排序演算法時,克魯斯卡演算法的時間復雜度即為O(eloge),因此當帶權圖的頂點個數較多而邊的條數較少時,使用克魯斯卡爾演算法構造最小生成樹效果最好!

克魯斯卡爾演算法
假設 WN=(V,{E}) 是一個含有 n 個頂點的連通網,則按照克魯斯卡爾演算法構造最小生成樹的過程為:先構造一個只含 n 個頂點,而邊集為空的子圖,若將該子圖中各個頂點看成是各棵樹上的根結點,則它是一個含有 n 棵樹的一個森林。之後,從網的邊集 E 中選取一條權值最小的邊,若該條邊的兩個頂點分屬不同的樹,則將其加入子圖,也就是說,將這兩個頂點分別所在的兩棵樹合成一棵樹;反之,若該條邊的兩個頂點已落在同一棵樹上,則不可取,而應該取下一條權值最小的邊再試之。依次類推,直至森林中只有一棵樹,也即子圖中含有 n-1條邊為止。

普里姆演算法
假設 WN=(V,{E}) 是一個含有 n 個頂點的連通網,TV 是 WN 上最小生成樹中頂點的集合,TE 是最小生成樹中邊的集合。顯然,在演算法執行結束時,TV=V,而 TE 是 E 的一個子集。在演算法開始執行時,TE 為空集,TV 中只有一個頂點,因此,按普里姆演算法構造最小生成樹的過程為:在所有「其一個頂點已經落在生成樹上,而另一個頂點尚未落在生成樹上」的邊中取一條權值為最小的邊,逐條加在生成樹上,直至生成樹中含有 n-1條邊為止。
--以上傳自http://hi..com/valyanprogramming/blog/item/1bc960e6095f9726b93820d9.html

1.Kruskal
//題目地址:http://acm.pku.e.cn/JudgeOnline/problem?id=1258

#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
struct node
{
int v1;
int v2;
int len;
}e[10000];//定義邊集
int cmp(const void *a,const void *b)//快排比較函數
{
return ((node*)a)->len-((node*)b)->len;
}
int v[100],a[100][100];//v為點集
void makeset(int n)
{
for(int i=0;i<n;i++)
v[i]=i;
}
int find(int x)
{
int h=x;
while(h!=v[h])
h=v[h];
return h;
}
int main()
{
int n,i,j,r1,r2,p,total;
while(scanf("%d",&n)!=EOF)
{
p=0;
total=0;
makeset(n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
e[p].v1=i;
e[p].v2=j;
e[p].len=a[i][j];
p++;
}
}
qsort(e,p,sizeof(e[0]),cmp);
for(i=0;i<p;i++)
{
r1=find(e[i].v1);
r2=find(e[i].v2);
if(r1!=r2)
{
total+=e[i].len;
v[r1]=r2;
}
}
printf("%d\n",total);
}
system("pause");
return 0;
}

2.Prim
//題目地址同上

#include <iostream>
using namespace std;

#define M 101
#define maxnum 100001
int dis[M][M];

int prim(int n)
{
bool used[M]={};
int d[M],i,j,k;
for(i=1; i<=n; i++)
d[i] = dis[1][i];
used[1] = true;
int sum=0;
for(i=1; i<n; i++){
int temp=maxnum;
for(j=1; j<=n; j++){
if( !used[j] && d[j]<temp ){
temp = d[j];
k = j;
}
}
used[k] = true;
sum += d[k];
for(j=1; j<=n; j++){
if( !used[j] && dis[k][j]<d[j] )
d[j] = dis[k][j]; // 與Dijksta演算法的差別之處
}
}
return sum;
}

int main()
{
int n,i,j;
while( cin>>n ){

for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
scanf("%d",&dis[i][j]);
if( !dis[i][j] )
dis[i][j] = maxnum;
}
}

cout<<prim(n)<<endl;
}
return 0;
}

代碼來自網路

㈡ es使用與原理6 -- 聚合分析剖析

有些聚合分析的演算法,是很容易就可以並行的,比如說max

有些聚合分析的演算法,是不好並行的,比如說,count(distinct),並不是說,在每個node上,直接就出一些distinct value,就可以的,因為數據可能會很多,假設圖中的協調節點3百萬個數據去重後還剩下100萬distinct的數據,那麼內存需要來存儲這100萬條數據,這是不可能的

es會採取近似聚合的方式,就是採用在每個node上進行近估計的方式,得到最終的結論,cuont(distcint),100萬,1050萬/95萬 --> 5%左右的錯誤率
近似估計後的結果,不完全准確,但是速度會很快,一般會達到完全精準的演算法的性能的數十倍

precision_threshold優化准確率和內存開銷

brand去重,如果brand的unique value,在100個以內,小米,長虹,三星,TCL,HTL。。。
在多少個unique value以內,cardinality,幾乎保證100%准確
cardinality演算法,會佔用precision_threshold * 8 byte 內存消耗,100 * 8 = 800個位元組
佔用內存很小。。。而且unique value如果的確在值以內,那麼可以確保100%准確
100,數百萬的unique value,錯誤率在5%以內
precision_threshold,值設置的越大,佔用內存越大,1000 * 8 = 8000 / 1000 = 8KB,可以確保更多unique value的場景下,100%的准確
field,去重,count,這時候,unique value,10000,precision_threshold=10000,10000 * 8 = 80000個byte,80KB

doc value正排索引
搜索+聚合 是怎麼實現的?
假設是倒排索引實現的

倒排索引來實現是非常不現實的,因為我們搜索的那個欄位search_field 有可能是分詞的,這就需要去掃描整個索引才能實現聚合操作,效率是及其低下的。
正排索引結構:
doc2: agg1
doc3: agg2
1萬個doc --> 搜 -> 可能跟搜索到10000次,就搜索完了,就找到了1萬個doc的聚合field的所有值了,然後就可以執行分組聚合操作了
doc value原理

1、doc value原理

(1)index-time生成

PUT/POST的時候,就會生成doc value數據,也就是正排索引

(2)核心原理與倒排索引類似

正排索引,也會寫入磁碟文件中,然後呢,os cache先進行緩存,以提升訪問doc value正排索引的性能
如果os cache內存大小不足夠放得下整個正排索引,doc value,就會將doc value的數據寫入磁碟文件中

(3)性能問題:給jvm更少內存,64g伺服器,給jvm最多16g

es官方是建議,es大量是基於os cache來進行緩存和提升性能的,不建議用jvm內存來進行緩存,那樣會導致一定的gc開銷和oom問題
給jvm更少的內存,給os cache更大的內存
64g伺服器,給jvm最多16g,幾十個g的內存給os cache
os cache可以提升doc value和倒排索引的緩存和查詢效率

2、column壓縮

doc1: 550
doc2: 550
doc3: 500

合並相同值,550,doc1和doc2都保留一個550的標識即可
(1)所有值相同,直接保留單值
(2)少於256個值,使用table encoding模式:一種壓縮方式
(3)大於256個值,看有沒有最大公約數,有就除以最大公約數,然後保留這個最大公約數

重點:
對分詞的field,直接執行聚合操作,會報錯,大概意思是說,你必須要打開fielddata,然後將正排索引數據載入到內存中,才可以對分詞的field執行聚合操作,而且會消耗很大的內存
先修改 欄位的fielddata屬性為true,再查 就能查找到數據

當然,我們也可以使用內置field(keyword)不分詞,對string field進行聚合,如果對不分詞的field執行聚合操作,直接就可以執行,不需要設置fieldata=true

分詞field+fielddata的工作原理

doc value --> 不分詞的所有field,可以執行聚合操作 --> 如果你的某個field不分詞,那麼在index-time,就會自動生成doc value --> 針對這些不分詞的field執行聚合操作的時候,自動就會用doc value來執行
分詞field,是沒有doc value的。。。在index-time,如果某個field是分詞的,那麼是不會給它建立doc value正排索引的,因為分詞後,佔用的空間過於大,所以默認是不支持分詞field進行聚合的
分詞field默認沒有doc value,所以直接對分詞field執行聚合操作,是會報錯的

對於分詞field,必須打開和使用fielddata,完全存在於純內存中。。。結構和doc value類似。。。如果是ngram或者是大量term,那麼必將佔用大量的內存。。。

如果一定要對分詞的field執行聚合,那麼必須將fielddata=true,然後es就會在執行聚合操作的時候,現場將field對應的數據,建立一份fielddata正排索引,fielddata正排索引的結構跟doc value是類似的,
但是只會講fielddata正排索引載入到內存中來,然後基於內存中的fielddata正排索引執行分詞field的聚合操作

如果直接對分詞field執行聚合,報錯,才會讓我們開啟fielddata=true,告訴我們,會將fielddata uninverted index,正排索引,載入到內存,會耗費內存空間

為什麼fielddata必須在內存?因為大家自己思考一下,分詞的字元串,需要按照term進行聚合,需要執行更加復雜的演算法和操作,如果基於磁碟和os cache,那麼性能會很差

我們是不是可以預先生成載入fielddata到內存中來???
query-time的fielddata生成和載入到內存,變為index-time,建立倒排索引的時候,會同步生成fielddata並且載入到內存中來,這樣的話,對分詞field的聚合性能當然會大幅度增強

㈢ ES集群原理與搭建

查看集群健康狀況:URL+ /GET _cat/health

Cluster

代表一個集群,集群中有多個節點,其中有一個為主節點,這個主節點是可以通過選舉產生的,主從節點是對於集群內部來說的。es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集群外部來說的,因為從外部來看es集群,在邏輯上是個整體,你與任何一個節點的通信和與整個es集群通信是等價的。

Shards

代表索引分片,es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分布到不同的節點上。構成分布式搜索。分片的數量只能在索引創建前指定,並且索引創建後不能更改。

replicas

代表索引副本,es可以設置多個索引的副本,副本的作用一是提高系統的容錯性,當某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。

Recovery

代表數據恢復或叫數據重新分布,es在有節點加入或退出時會根據機器的負載對索引分片進行重新分配,掛掉的節點重新啟動時也會進行數據恢復。

(2)、ES為什麼要實現集群

在單台ES伺服器節點上,隨著業務量的發展索引文件慢慢增多,會影響到效率和內存存儲問題等。

我們可以採用ES集群,將單個索引的分片到多個不同分布式物理機器上存儲,從而可以實現高可用、容錯性等。

ES集群中索引可能由多個分片構成,並且每個分片可以擁有多個副本。通過將一個單獨的索引分為多個分片,我們可以處理不能在一個單一的伺服器上面運行的大型索引,簡單的說就是索引的大小過大,導致效率問題。不能運行的原因可能是內存也可能是存儲。由於每個分片可以有多個副本,通過將副本分配到多個伺服器,可以提高查詢的負載能力。

(3)、ES是如何解決高並發

ES是一個分布式全文檢索框架,隱藏了復雜的處理機制,內部使用 分片機制、集群發現、分片負載均衡請求路由。

Shards 分片:代表索引分片,es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分布到不同的節點上。構成分布式搜索。分片的數量只能在索引創建前指定,並且索引創建後不能更改。

Replicas分片:代表索引副本,es可以設置多個索引的副本,副本的作用一是提高系統的容錯性,當某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。

1、每個索引會被分成多個分片shards進行存儲,默認創建索引是分配5個分片進行存儲。每個分片都會分布式部署在多個不同的節點上進行部署,該分片成為primary shards。

注意:索引的主分片primary shards定義好後,後面不能做修改。

2、為了實現高可用數據的高可用,主分片可以有對應的備分片replics shards,replic shards分片承載了負責容錯、以及請求的負載均衡。

注意: 每一個主分片為了實現高可用,都會有自己對應的備分片,主分片對應的備分片不能存放同一台伺服器上。主分片primary shards可以和其他replics shards存放在同一個node節點上。

3、documnet routing(數據路由)

當客戶端發起創建document的時候,es需要確定這個document放在該index哪個shard上。這個過程就是數據路由。

路由演算法:shard = hash(routing) % number_of_primary_shards

如果number_of_primary_shards在查詢的時候取余發生的變化,無法獲取到該數據

注意:索引的主分片數量定義好後,不能被修改

高可用視圖分析(下圖所示:上面的圖,如果節點1與節點2宕機了,es集群數據就不完整了。下面圖,如果節點1與節點2宕機了,es集群數據還是完整的)

(1)、伺服器環境

准備三台伺服器集群

| 伺服器名稱 | IP地址 |
| node-1 | 192.168.212.182 |
| node-2 | 192.168.212.183 |
| node-3 | 192.168.212.184 |

(2)、關閉防火牆

(3)、**** http://192.168.212.185:9200/_cat/nodes?pretty

*號表示為master節點

注意:

注意克隆data文件會導致數據不同步

報該錯誤解決辦法 :

failed to send join request to master

因為克隆導致data文件也克隆呢,直接清除每台伺服器data文件。

㈣ 進化演算法的特點

進化計算是一種具有魯棒性的方法,能適應不同的環境不同的問題,而且在大多數情況下都能得到比較滿意的有效解。他對問題的整個參數空間給出一種編碼方案,而不是直接對問題的具體參數進行處理,不是從某個單一的初始點開始搜索,而是從一組初始點搜索。搜索中用到的是目標函數值的信息,可以不必用到目標函數的導數信息或與具體問題有關的特殊知識。因而進化演算法具有廣泛的應用性,高度的非線性,易修改性和可並行性。
此外,演算法本身也可以採用動態自適應技術,在進化過程中自動調整演算法控制參數和編碼精度,比如使用模糊自適應法 。 進化策略(ES)是在1965年由Rechenberg和Schwefel獨立提出的。
進化策略的一般演算法
(1) 問題為尋找實值n維矢量x,使得函數F(x): R→R取極值。不失一般性,設此程序為極小化過程。
(2) 從各維的可行范圍內隨機選取親本xi,i = 1, … , p的始值。初始試驗的分布一般是均勻分布。
(3) 通過對於x的每個分量增加零均值和預先選定的標准差的高斯隨機變數,從每個親本xi產生子代xi』。
(4) 通過將適應度F(xi)和F(xi』),i=1,…,P進行排序,選擇並決定那些矢量保留。具有最小適應度的P個矢量變成下一代的新親本。
進行新試驗,選擇具有最小方差的新子代,一直到獲得充分解,或者直到滿足某個終止條件。
在這個模型中,把試驗解的分量看做個體的行為特性,而不是沿染色體排列的基因。假設不管發生什麼遺傳變換,所造成各個個體行為的變化均遵循零均值和某個標准差的高斯分布。
由於基因多效性和多基因性,特定基因的改變可以影響許多表現型特徵。所以在創造新子系時,較為合適的是同時改變親本所有分量。
(1+1)—ES:
早期的進化策略的種群中只包含一個個體,並且只使用變異操作。在每一代中,變異後的個體與其父代進行比較,並選擇較好的一個,這種選擇策略被稱為(1+1)策略。
(1+1)—ES的缺點:
(1) 各維取定常的標推差使得程序收斂到最優解的速度很慢;
(2) 點到點搜索的脆弱本質使得程序在局部極值附近容易受停滯的影響(雖然此演算法表明可以漸近地收斂到全局最優點)。
(μ+λ)—ES:μ個親本製造λ個子代,所有解均參加生存競爭,選出最好的μ個作為下一代的親本。
(μ,λ)—ES:只有λ個子代參加生存競爭,在每代中μ個親本被完全取代。
1.個體的表示法:
每個解矢量不僅包括了n維試驗矢量x,而且還包括了擾動矢量σ,後者給出如何變異x以及它本身如何變異的指令。
2.變異:
設x為當前矢量。σ為對應於x每個維的方差矢量,於是新的解矢量x』,σ』可以這樣產生:
3.交叉:
4.選擇
在進化策略中,選擇是按完全確定的方式進行。(μ,λ)—ES是從λ個子代個體集中選擇μ(1<μ<λA=個最好的個體;(μ+λ)—ES是從父代和子代個體的並集中選擇μ個最好的個體。雖然(μ+λ)—ES保留最優的個體能保證性能單調提高,但這種策略不能處理變化的環境,因此,目前選用最多的還是(μ,λ)—ES。 進化規劃(EP)由Fogel在20世紀60年代提出。
1.表示法和適應值度量
進化規劃假設—個有界子空間 ,其中ui<vi。搜索區域被擴展到I=R,即個體為目標變數向量,a=x∈I,進化規劃把目標函數值通過比例變換到正值,同時加入某個隨機改變θ來得到適應值 ,其中δ是比例函數。
2.變異
可簡化為:
3.選擇
在P個父代個體每個經過一次變異產生P個子代後,進化規劃利用一種隨機q競爭選擇方法從父代和子代的集合中選擇P個個體,其中q>1是選擇演算法的參數。

㈤ ES原理之選主流程

分布式系統的集群方式大致可以分為主從模式(Master-Slave)和無主模式。

常用的選舉演算法有比較簡單的Bully演算法和復雜而強大的Paxos演算法。

每個節點有一個唯一ID,然後對集群中所有的節點ID進行排序,選取其中最小的ID所屬的節點作為Master。
Bully演算法的問題: 假設當前Master因為負載過重而假死,然後ID第二大的被選舉為新的Master,這時舊的Master恢復然後又被選舉為Master然後又會因為負載過重而假死......

Paxos實現起來非常復雜,但非常強大,尤其在什麼時機,以及如何進行選舉方面的靈活性比簡單的Bully演算法有很大的優勢,因為在現實生活中,存在比網路鏈接異常更多的故障模式。
ES使用的是Bully演算法,並對其做了一些優化:

㈥ es查詢數據的工作原理是什麼

查詢,GET某一條數據,寫入了某個document,這個document會自動給你分配一個全局唯一的id,doc id,同時也是根據doc id進行hash路由到對應的primary shard上面去。也可以手動指定doc id,比如用訂單id,用戶id。

我們可以通過doc id來查詢,會根據doc id進行hash,判斷出來當時把doc id分配到了哪個shard上面去,從那個shard去查詢

1)客戶端發送請求到任意一個node,成為coordinate node(協調結點)
2)coordinate node進行hash後對document進行路由,將請求轉發到對應的node,此時會使用round-robin 隨機輪詢演算法 ,在primary shard以及其所有replica node中 隨機選擇一個 ,讓讀請求負載均衡
3)接收請求的node返回document給coordinate node
4)coordinate node返回document給客戶端

es最強大的是做全文檢索,就是比如你有三條數據

java真好玩兒啊
java好難學啊
j2ee特別牛

你根據java關鍵詞來搜索,將包含java的document給搜索出來

es就會給你返回:java真好玩兒啊,java好難學啊

1)客戶端發送請求到一個coordinate node
2)協調節點 將搜索請求轉發到 所有的shard 對應的primary shard或replica shard
3)query phase: 每個shard將自己的搜索結果 (其實就是一些 doc id ), 返回給協調節點 ,由協調節點進行數據的 合並、排序、分頁 等操作,產出最終結果
4)fetch phase:接著由 協調節點,根據doc id去各個節點上拉取實際的document數據 ,最終返回給客戶端

尤其要注意的這里是先拿的id喲

㈦ es使用與原理2 -- scoll技術,bouncing results,零停機重建索引等等

默認情況下,是按照_score降序排序的,我們也可以定製排序規則

Elasticsearch使用的是 term frequency/inverse document frequency演算法,簡稱為TF/IDF演算法
Term frequency(TF): 搜索文本中的各個詞條在field文本中出現了多少次,出現次數越多,就越相關
如:搜索請求:hello world
doc1:hello you, and world is very good
doc2:hello, how are you
doc1 肯定比doc2的評分高,因為hello world都在doc1中出現了。
Inverse document frequency(IDF): 搜索文本中的各個詞條在整個索引的所有文檔中出現了多少次,出現的次數越多,就越不相關
搜索請求:hello world
doc1:hello, today is very good
doc2:hi world, how are you
比如說,在index中有1萬條document,hello這個單詞在所有的document中,一共出現了1000次;world這個單詞在所有的document中,一共出現了100次
那最終的結果肯定是 word的得分所佔比更高

關於_score,ES還有一條規則。
Field-length norm:field長度,field越長,相關度越弱
搜索請求:hello world
doc1:{ "title": "hello article", "content": "babaaba 1萬個單詞" }
doc2:{ "title": "my article", "content": "blablabala 1萬個單詞,hi world" }
hello world在整個index中出現的次數是一樣多的。最終 doc1得分更高

搜索的時候,要依靠倒排索引;排序的時候,需要依靠正排索引,看到每個document的每個field,然後進行排序,所謂的正排索引,其實就是doc values,doc values 也可以供排序,聚合,過濾等操作使用。doc values是被保存在磁碟上的,此時如果內存足夠,os會自動將其緩存在內存中,性能還是會很高;如果內存不足夠,os會將其寫入磁碟上
正排索引如下:

倒排索引不可變的好處

想像一下有兩個文檔有同樣值的時間戳欄位,搜索結果用 timestamp 欄位來排序。 由於搜索請求是在所有有效的分片副本間輪詢的,那就有可能發生主分片處理請求時,這兩個文檔是一種順序, 而副本分片處理請求時又是另一種順序。
這就是所謂的 bouncing results 問題: 每次用戶刷新頁面,搜索結果表現是不同的順序。 讓同一個用戶始終使用同一個分片,這樣可以避免這種問題, 可以設置 preference 參數為一個特定的任意值比如用戶會話ID來解決。

如果一次性要查出來比如10萬條數據,那麼性能會很差,此時一般會採取用scoll滾動查詢,一批一批的查,直到所有數據都查詢完處理完。

scoll,看起來挺像分頁的,但是其實使用場景不一樣。分頁主要是用來一頁一頁搜索,給用戶看的;scoll主要是用來一批一批檢索數據,讓系統進行處理的

使用scoll滾動搜索,可以先搜索一批數據,然後下次再搜索一批數據,以此類推,直到搜索出全部的數據來
scoll搜索會在第一次搜索的時候,保存一個當時的視圖快照,之後只會基於該舊的視圖快照提供數據搜索,如果這個期間數據變更,是不會讓用戶看到的
採用基於_doc進行排序的方式,性能較高
每次發送scroll請求,我們還需要指定一個scoll參數,指定一個時間窗口,每次搜索請求只要在這個時間窗口內能完成就可以了

獲得的結果會有一個scoll_id,下一次再發送scoll請求的時候,必須帶上這個scoll_id

1 創建索引

2 修改索引

3 刪除索引

lucene是沒有type的概念的,在document中,實際上將type作為一個document的field來存儲,即_type,es通過_type來進行type的過濾和篩選
一個index中的多個type,實際上是放在一起存儲的,因此一個index下,不能有多個type重名,而類型或者其他設置不同的,因為那樣是無法處理的
比如

底層存儲是這樣的

將類似結構的type放在一個index下,這些type應該有多個field是相同的
假如說,你將兩個type的field完全不同,放在一個index下,那麼就每條數據都d會有大量field在底層的lucene中是空值,會有嚴重的性能問題

1、定製dynamic策略
true:遇到陌生欄位,就進行dynamic mapping
false:遇到陌生欄位,就忽略
strict:遇到陌生欄位,就報錯

2、定製自己的dynamic mapping template(type level)

上面的設置是/my_index/my_type 的欄位,如果是以_en結尾的,那麼就自動映射為string類型

一個field的設置是不能被修改的,如果要修改一個Field,那麼應該重新按照新的mapping,建立一個index,然後將數據批量查詢出來,重新用bulk api寫入index中。
批量查詢的時候,建議採用scroll api,並且採用多線程並發的方式來reindex數據,每次scoll就查詢指定日期的一段數據,交給一個線程即可。

(1)一開始,依靠dynamic mapping,插入數據,但是不小心有些數據是2017-01-01這種日期格式的,所以title這種field被自動映射為了date類型,實際上業務認為它應該是string類型的

(2)當後期向索引中加入string類型的title值的時候,就會報錯

(3)如果此時想修改title的類型,是不可能的

(4)此時,唯一的辦法,就是進行reindex,也就是說,重新建立一個索引,將舊索引的數據查詢出來,再導入新索引
(5)如果說舊索引的名字,是old_index,新索引的名字是new_index,終端java應用,已經在使用old_index在操作了,難道還要去停止java應用,修改使用的index為new_index,才重新啟動java應用嗎?這個過程中,就會導致java應用停機,可用性降低
(6)所以說,給java應用一個別名,這個別名是指向舊索引的,java應用先用著,java應用先用goods_index alias來操作,此時實際指向的是舊的my_index

(7)新建一個index,調整其title的類型為string

(8)使用scroll api將數據批量查詢出來

(9)採用bulk api將scoll查出來的一批數據,批量寫入新索引

(10)反復循環8~9,查詢一批又一批的數據出來,採取bulk api將每一批數據批量寫入新索引

(11)將goods_index alias切換到my_index_new上去,java應用會直接通過index別名使用新的索引中的數據,java應用程序不需要停機,零提交,高可用

(12)直接通過goods_index別名來查詢,是否ok

現有流程的問題,每次都必須等待fsync將segment刷入磁碟,才能將segment打開供search使用,這樣的話,從一個document寫入,到它可以被搜索,可能會超過1分鍾!!!這就不是近實時的搜索了!!!主要瓶頸在於fsync實際發生磁碟IO寫數據進磁碟,是很耗時的。

熱點內容
演算法導論對數 發布:2025-03-19 07:30:58 瀏覽:144
sql字元串日期 發布:2025-03-19 07:30:52 瀏覽:730
編程求距離 發布:2025-03-19 07:30:52 瀏覽:979
win8無法訪問共享 發布:2025-03-19 07:30:49 瀏覽:28
個人電腦怎麼把伺服器放到公網 發布:2025-03-19 07:19:35 瀏覽:785
linux配置網路界面 發布:2025-03-19 07:10:10 瀏覽:900
安卓哪個手機最小 發布:2025-03-19 07:09:08 瀏覽:621
電腦無線網路怎麼打開伺服器 發布:2025-03-19 06:53:09 瀏覽:925
網頁緩存視頻下載 發布:2025-03-19 06:52:19 瀏覽:987
演算法實戰 發布:2025-03-19 06:52:14 瀏覽:515