Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 58

0
votes
answers
39 views
+10

ElasticSearch - 地理位置陣列上的空間搜索

0

我正在創建兩種類型的餐廳和分支與春季數據的索引。餐廳有許多分店作爲嵌套式。當我創建這個映射時,Spring Data/ElasticSearch自動將分支類型內的位置字段轉換爲緯度,經度數組,因此地理空間查詢是不可能的。這裏是:ElasticSearch - 地理位置陣列上的空間搜索

我想要在地理空間搜索的branch.location執行搜索,但彈性搜索不處理位置作爲地點,而是一個字符串數組,因此這是不可能的,請建議我需要什麼做什麼或哪裏出錯。

class Restaurant { 
    @Field(type = FieldType.Nested) 
    private List<Branch> branches = new ArrayList<Branch>(); 
} 

class Branch { 
    private GeoPoint location; 
} 
沙发
0
0

確保您使用的

org.springframework.data.elasticsearch.core.geo.GeoPoint

而且不

org.elasticsearch.common.geo。 GeoPoint

或者(也許更好),定義mappin g,而不是讓spring/elasticsearch爲你做。

82
votes
answers
21 views
+10

elasticsearch filtering by the size of a field that is an array

How can I filter documents that have a field which is an array and has more than N elements?

How can I filter documents that have a field which is an empty array?

Is facets the solution? If so, how?

up vote 51 down vote accepted favorite
沙发
+510
+50

我會看一下腳本過濾器以下過濾器應僅返回fieldname字段中至少包含10個元素的文檔,即陣列。請記住,這可能很昂貴,具體取決於索引中包含的文檔數量。

"filter" : {
    "script" : {
        "script" : "doc['fieldname'].values.length > 10"
    }
}

關於第二個問題:那你真的有一個空陣列嗎?或者它只是一個沒有值的數組字段?您可以使用缺少的過濾器來獲取對於特定字段沒有任何價值的文檔:

"filter" : {
    "missing" : { "field" : "user" }
}

否則我猜你需要再次使用腳本,類似於我上面提到的,只是輸入不同的長度。如果長度是常量,我會把它放在params部分中,這樣腳本將被elasticsearch緩存並重用,因為它始終是相同的:

"filter" : {
    "script" : {
        "script" : "doc['fieldname'].values.length > param1"
        "params" : {
            "param1" : 10
        }
    }
}

如果字段是字符串而不是數組,你會知道怎麼做嗎?我試過“劇本”:“doc ['title']。value.length()> 10”但沒有運氣...... - david_adler 2014年11月24日19:15

我有同樣的問題,該字段是一個數組,但ES將其視為String,因此它拋出groovy.lang.MissingPropertyException:沒有這樣的屬性:類的長度:java.lang.String - lisak 5月25日'15在9 :25

@lisak試試這個:“script”:“doc ['fieldname']。size()> 50” - Alex Fedulov 2016年6月13日11:32

@david_adler我發布了這類問題的答案(當字段是文本字段時)。stackoverflow.com/a/54213332/1987830 - Luka Lopusina 1月16日8:55

+130

javanna的答案在Elasticsearch 1.3.x及更早版本中是正確的,因為1.4默認腳本模塊已更改為groovymvel)。

回答OP的問題。

在Elasticsearch 1.3.x及更早版本中,使用以下代碼:

"filter" : {
    "script" : {
        "script" : "doc['fieldname'].values.length > 10"
    }
}

在Elasticsearch 1.4.x及更高版本中,使用以下代碼:

"filter" : {
    "script" : {
        "script" : "doc['fieldname'].values.size() > 10"
    }
}

此外,在Elasticsearch 1.4.3及更高版本中,由於安全性問題,您需要啟用動態腳本,因為它已默認禁用。請參閱:https//www.elastic.co/guide/en/elasticsearch/reference/1.4/modules-scripting.html

+60

Imho使用腳本按大小過濾數組的正確方法是:

"filter" : {
    "script" : {
        "script" : "_source.fieldName.size() > 1"
    }
}

如果我這樣做,因為@javanna建議拋出異常 groovy.lang.MissingPropertyException: No such property: length for class: java.lang.String

源比doc慢得多,它會擊中磁盤。 - whitfin 2015年7月10日23:07

另請注意,您已使用fieldName,而其他使用了fieldname。 - whitfin 2015年10月10日16:14

原因是Groovy為數組和字符串提供了size()。如果不是所有的值都是數組,那麼你將遇到你所做的問題,因為你試圖在String上使用一個不存在的長度屬性。 - pickypg 2015年11月20日17:44

+50

還在這裡貼出了與我相同情況的人。假設您的數據如下所示:

{
    "_source": {
        "fieldName" : [
            {
                "f1": "value 11",
                "f2": "value 21"
            },
            {
                "f1": "value 12",
                "f2": "value 22"
            }
        ]
    }
}

然後過濾fieldName長度> 1,例如:

"query": {
    "bool" : {
        "must" : {
            "script" : {
                "script" : {
                    "inline": "doc['fieldName.f1'].values.length > 1",
                    "lang": "painless"
                 }
            }
        }
    }
}

腳本語法為ES 5.4文檔https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-script-query.html

+40

基於此:https//code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/collect/RegularImmutableList.java?r = 707f3a276d4ea8e9d53621d137febb00cd2128da

關於利薩克的答案。

有size()函數返回列表的長度:

"filter" : {
    "script" : {
        "script" : "doc['fieldname'].values.size() > 10"
    }
}
+20

最簡單的方法是對數據進行“非規範化”,以便擁有包含計數的屬性和一個布爾值(如果存在或不存在)。然後你可以搜索這些屬性。

例如:

{
   "id": 31939,
   "hasAttachments": true,
   "attachmentCount": 2,
   "attachments": [
      {
         "type": "Attachment",
         "name": "txt.txt",
         "mimeType": "text/plain"
      },
      {
         "type": "Inline",
         "name": "jpg.jpg",
         "mimeType": "image/jpeg"
      }
   ]  
}
+10

當你需要找到包含某個字段的文檔時,大小/長度應該更大,那麼@javanna給出了正確的答案。我只想添加如果您的字段是文本字段,並且您想要查找包含該字段中某些文本的文檔,則不能使用相同的查詢。你需要做這樣的事情:

GET index/_search 
{
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "FIELD_NAME": {
                            "gt": 0
                        }
                    }
                }
            ]
        }
    }
}

這不是這個問題的確切答案,因為答案已經存在,但我遇到的類似問題的解決方案也許有人會覺得它很有用。

187
votes
answers
7 views
+10

elasticsearch - what to do with unassigned shards

my cluster is with yellow status because some shards are unassigned. what to do with this?

I tried set cluster.routing.allocation.disable_allocation = false to all indexes, but I think this don't work because I'm using version 1.1.1.

I also tried restarting all machines, but same happens.

Any idea?

EDIT :

  • Cluster stat :

    { 
      cluster_name: "elasticsearch",
      status: "red",
      timed_out: false,
      number_of_nodes: 5,
      number_of_data_nodes: 4,
      active_primary_shards: 4689,
      active_shards: 4689,
      relocating_shards: 0,
      initializing_shards: 10,
      unassigned_shards: 758
    }
    
up vote 18 down vote accepted favorite
沙发
+180
+50

那些未分配的分片實際上是來自主節點的實際分片的未分配副本。

為了分配這些分片,您需要運行一個新的elasticsearch實例來創建一個輔助節點來承載數據副本。

編輯:有時未分配的分片屬於已刪除的索引,這使得它們孤立的分片無論是否添加節點都不會分配。但事實並非如此!

index.routing.allocation.total_shards_per_node = -1(默認值) - Leabdalla 2014年5月16日15:02

我有1800個索引,一些有2個分片,有些有10個分片。所有這些都分配給4台數據機,8gb ram和80gb ssd - Leabdalla 2014年5月16日15:03

你有幾個節點?你可以發布你的elasticsearch-head插件的截圖嗎? - eliasah 2014年5月16日15:05

+1050

分配不會發生的原因有很多:

  1. 您在不同的節點上運行不同版本的Elasticsearch
  2. 您的群集中只有一個節點,但您將副本數設置為零以外的其他節點。
  3. 您沒有足夠的磁盤空間。
  4. 您已禁用分片分配。
  5. 您啟用了防火牆或SELinux。啟用SELinux但未正確配置後,您將看到分片永久停留在INITIALIZING或RELOCATING中。

作為一般規則,您可以解決以下問題:

  1. 查看集群中的節點:curl -s 'localhost:9200/_cat/nodes?v'如果您只有一個節點,則需要設置number_of_replicas為0.(請參閱ES文檔或其他答案)。
  2. 查看集群中可用的磁盤空間: curl -s 'localhost:9200/_cat/allocation?v'
  3. 檢查群集設置:curl 'http://localhost:9200/_cluster/settings?pretty'並查找cluster.routing設置
  4. 看看哪些碎片是UNASSIGNED curl -s localhost:9200/_cat/shards?v | grep UNASS
  5. 嘗試強制分配分片

    curl -XPOST -d '{ "commands" : [ {
      "allocate" : {
           "index" : ".marvel-2014.05.21", 
           "shard" : 0, 
           "node" : "SOME_NODE_HERE",
           "allow_primary":true 
         } 
      } ] }' http://localhost:9200/_cluster/reroute?pretty
    
  6. 查看響應並查看其內容。會有一堆YES是好的,然後是NO。如果沒有任何NO,則可能是防火牆/ SELinux問題。

這很好,謝謝 - 我用這種方式找到了我的問題。事實證明我的一個節點的Elasticsearch版本稍微落後於其他節點,因此集群拒絕將這些分片複製到它。哦,差異很小 - 1.4.2對1.4.4。 - KJH 2015年3月13日15:48

這會告訴您哪個索引未分配。有時它是您認為已刪除的索引!看起來像ES中的一個錯誤,但這至少可以讓你找出其未分配的確切原因!謝謝 - hubbardr 2015年4月22日14:54

謝謝你!我有一段時間弄清楚為什麼在向集群添加新節點後我的分片沒有被分配 - 新節點比舊節點稍微新一點。 - 2015年7月24日17:21

非常感謝!調試流程是無價的。 - Matteo Melani 2016年2月11日17:05

謝謝你的暗示!如果你只有一個節點,你肯定不需要復製品...... - jonashackt 2016年9月23日12:51

+500

這是默認索引設置引起的常見問題,尤其是當您嘗試在單個節點上進行複制時。要使用瞬態群集設置解決此問題,請執行以下操作

curl -XPUT http://localhost:9200/_settings -d '{ "number_of_replicas" :0 }'

接下來,啟用集群重新分配分片(您可以在完成所有操作後始終打開它):

curl -XPUT http://localhost:9200/_cluster/settings -d '
{
    "transient" : {
        "cluster.routing.allocation.enable": true
    }
}'

現在請坐下來觀看群集清理未分配的副本分片。如果您希望此功能在將來的索引中生效,請不要忘記使用以下設置修改elasticsearch.yml文件並退回群集:

index.number_of_replicas: 0

這對我有用。windows命令供參考:curl -XPUT localhost:9200 / _settings -d“{”“”number_of_replicas“”“:0}”curl -XPUT localhost:9200 / _cluster / settings -d“{”“”transient“”“ :{“”“cluster.routing.allocation.enable”“”:true}}“ - gigi 2015年10月19日13:59

true不是cluster.routing.allocation.enable的有效值(這將拋出java.lang.IllegalArgumentException:Illegal allocation.enable value [TRUE])。有效值為全部,初選,new_primaries或無(來源:elastic.co/guide/en/elasticsearch/reference/2.4 / ...) - Bastien Libersa 1月21日9:40

+100

唯一對我有用的是更改number_of_replicas(我有2個副本,所以我將其更改為1然後再更改為2)。

第一:

PUT /myindex/_settings
{
    "index" : {
        "number_of_replicas" : 1
     }
}

然後:

PUT /myindex/_settings
{
    "index" : {
        "number_of_replicas" : 2
     }
}

我有大約20個未分配的分片和一個空節點(6個)。將其中一個的'number_of_replicas'設置為1,然後再設置為2,似乎會鬆動,並且所有未分配的副本都會移動到空節點。 - Rodney Gitzel 2015年10月13日15:12

+40

Alcanzar的答案的前2點為我做了,但我不得不補充

"allow_primary" : true

像這樣

curl -XPOST http://localhost:9200/_cluster/reroute?pretty -d '{
  "commands": [
    {
      "allocate": {
        "index": ".marvel-2014.05.21",
        "shard": 0,
        "node": "SOME_NODE_HERE",
        "allow_primary": true
      }
    }
  ]
}'
0

對於較新的ES版本,這應該可以解決問題(在Kibana DevTools中運行):

PUT /_cluster/settings
{
  "transient" : {
    "cluster.routing.rebalance.enable" : "all"
  }
}

但是,這不會解決根本原因。在我的情況下,有很多未分配的分片,因為默認副本大小為1但實際上我只使用單個節點。所以我也添加到我的elasticsearch.yml這一行:

index.number_of_replicas: 0
-10

檢查每個節點上的ElasticSearch版本是否相同。如果不是,那麼ES將不會將索引的副本分配給“較舊”的節點。

使用@ Alcanzar的答案,您可以收到一些診斷錯誤消息:

curl -XPOST 'http://localhost:9200/_cluster/reroute?pretty' -d '{
  "commands": [
    {
      "allocate": {
        "index": "logstash-2016.01.31",
        "shard": 1,
        "node": "arc-elk-es3",
        "allow_primary": true
      }
    }
  ]
}'

結果是:

{
  "error" : "ElasticsearchIllegalArgumentException[[allocate] allocation of
            [logstash-2016.01.31][1] on node [arc-elk-es3]
            [Xn8HF16OTxmnQxzRzMzrlA][arc-elk-es3][inet[/172.16.102.48:9300]]{master=false} is not allowed, reason:
            [YES(shard is not allocated to same node or host)]
            [YES(node passes include/exclude/require filters)]
            [YES(primary is already active)]
            [YES(below shard recovery limit of [2])]
            [YES(allocation disabling is ignored)]
            [YES(allocation disabling is ignored)]
            [YES(no allocation awareness enabled)]
            [YES(total shard limit disabled: [-1] <= 0)]
            *** [NO(target node version [1.7.4] is older than source node version [1.7.5]) ***
            [YES(enough disk for shard on node, free: [185.3gb])]
            [YES(shard not primary or relocation disabled)]]",
  "status" : 400
}

如何確定ElasticSearch的版本號:

adminuser@arc-elk-web:/var/log/kibana$ curl -XGET 'localhost:9200'
{
  "status" : 200,
  "name" : "arc-elk-web",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.7.5",
    "build_hash" : "00f95f4ffca6de89d68b7ccaf80d148f1f70e4d4",
    "build_timestamp" : "2016-02-02T09:55:30Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

就我而言,我apt-get錯誤地設置了存儲庫,並且它們在不同的服務器上不同步。我在所有服務器上更正了:

echo "deb http://packages.elastic.co/elasticsearch/1.7/debian stable main" | sudo tee -a /etc/apt/sources.list

然後平常:

sudo apt-get update
sudo apt-get upgrade

並最終重啟服務器。

70
votes
answers
12 views
+10

ElasticSearch - Optimal number of Shards per node

I would appreciate if someone could suggest the optimal number of shards per ES node for optimal performance or provide any recommended way to arrive at the number of shards one should use, given the number of cores and memory foot print.

沙发
+90
+50

在分片之前你有三個條件考慮..

情況1)您希望將elasticsearch與故障轉移和高可用性結合使用。然後你去分片。在這種情況下,您需要根據要在生產中使用的節點數[ES實例]來選擇分片數。

考慮一下你想在生產中提供3個節點。然後,您需要為每個索引選擇1個主分片和2個副本。如果您選擇的碎片多於您需要的碎片。

情況2)您當前的服務器將保存當前數據。但是由於未來動態數據的增加,最終磁盤上沒有空間,或者您的服務器無法處理大量數據,因此您需要為每個索引配置更多的分片,如2或3個分片(根據您的要求)。但是不應該有任何復製品。

情況3)在這種情況下,你是情況1和2的組合情況,那麼你需要結合兩種配置。考慮您的數據動態增加,您還需要高可用性和故障轉移。然後配置一個包含2個分片和1個副本的索引。然後,您可以在節點之間共享數據並獲得最佳性能..!

注意: 然後將在每個分片中處理查詢並對所有分片的結果執行mapreduce並將結果返回給我們。因此,地圖縮減過程是昂貴的過程。最小分片為我們提供了最佳性能

如果您在生產中僅使用一個節點,那麼每個索引只有一個主分片是最佳分片。

希望能幫助到你..!

我不認為你理解複製品的概念。假設您將索引設置為包含3個分片和1個副本。這實際上意味著你將有6個分片,儘管一次只能使用3個分片。1個副本表示每個分片的1個副本。對於3個分片的最安全的故障轉移,您實際上需要2個副本,這樣您就可以在每個節點上擁有一個活動分片和其他兩個活動分片的副本。 - 克里斯普拉特2015年4月6日19:46

我同意你的命令@ChrisPratt,上述哪一點與你的命令相矛盾? - BlackPOP 2015年4月7日10:12

您建議如果OP有3個節點,那麼它們應該有1個主節點和2個副本。這將導致僅使用一個節點,因為只有一個碎片。同時,其他兩個節點每個只能獲得一個副本。這提供了故障轉移,但沒有負載平衡。對於三節點設置,最佳分片數量為3,最佳副本數量為2.這將為您提供最佳性能和故障轉移,但如果沒有重新索引,它也不允許任何水平擴展。 - 克里斯普拉特2015年4月9日14:17

OP不清楚讀取或寫入性能對於它們的場景是否更重要,但是正如BlackPOP建議的那樣,具有1個主要和2個副本分片的索引將充分利用3節點集群進行讀取操作; 請參閱elastic.co/guide/en/elasticsearch/guide/current/... - Dusty 2015年6月23日16:50

副本分片可以提供讀取請求,因此它們不會閒置。 - Derek 18年2月5日23:08

+510

我遲到了,但我只想指出幾件事:

  1. 每個索引的最佳分片數始終為1.但是,這不提供水平縮放的可能性。
  2. 每個節點的最佳分片數始終為1.但是,您不能水平縮放超過當前節點數。

重點是分片具有索引和查詢的固有成本。每個分片實際上是一個單獨的Lucene索引。當您運行查詢時,Elasticsearch必須針對每個分片運行該查詢,然後將各個分片結果一起編譯以提供最終結果以進行發送。分片的好處是索引可以分佈在群集中的節點上以獲得更高的可用性。換句話說,這是一種權衡。

最後,應該注意每個節點超過1個分片將引入I / O注意事項。由於必須單獨索引和查詢每個分片,因此具有2個或更多分片的節點將需要2個或更多單獨的I / O操作,這些操作無法同時運行。如果你的節點上有SSD,那麼實際的成本可以降低,因為所有的I / O發生更快。不過,這是需要注意的事情。

那麼,這就引出了為什麼你想要每個節點有多個分片的問題?答案就是計劃的可擴展性。索引中的分片數是固定的。稍後添加更多分片的唯一方法是重新創建索引並重新索引所有數據。取決於索引的大小,這可能是也可能不是什麼大不了的事。在撰寫本文時,Stack Overflow的索引是203GB(參見:https://stackexchange.com/performance )。重建所有數據是一件大事,因此重新分配將是一場噩夢。如果您有3個節點和總共6個分片,這意味著您可以在以後輕鬆擴展到最多6個節點而無需重新分片。

假設您正在存儲日誌數據,並且每天的價值都會存儲到新索引中。如果查詢加載通常只搜索最近幾天的索引,那麼將舊索引的反向索引加載到內存中會有好處嗎? - Dan Hook 2015年3月25日15:35

@DanHook:對不起,但我不確定我理解。Elasticsearch僅將內容加載到內存中。每個索引至少有一個lucene索引,因此如果您的查詢沒有跨越所有索引,則不需要觸及其他索引。這就是你問的問題嗎? - 克里斯普拉特2015年3月25日15:40

差不多。聽到“每個節點的最佳分片數始終是1”,我感到有些驚訝,所以我開始嘗試提出異常。 - Dan Hook 2015年3月25日19:43

是的,它只是歸結為需要搜索多少Lucene索引以及它們的居住地。分片只是一個單獨的Lucene索引。每個Elasticsearch索引至少有一個分片,因此至少有一個Lucene索引,但是如果你有3個分片,例如,那3個Lucene索引必須獨立搜索,然後在進行最終評分之前將它們的結果集組合在一起。如果這些Lucene索引中的一些駐留在同一驅動器上,則情況會更糟,因為您只能串行查詢而不是並行查詢。 - 克里斯普拉特2015年3月25日20:02

@AnhTriet以下是文檔中的相關部分:elastic.co/guide/en/elasticsearch/guide/current/... - Chris Pratt 17年10月23日16:00

+50

每個節點有多個主分片可能也是個好主意,具體取決於用例。我發現批量索引很慢,只使用了一個CPU內核 - 所以我們有空閒的CPU功率和非常低的IO,絕對硬件不是瓶頸。顯示的線程池統計信息,在索引期間只有一個批量線程處於活動狀態。我們有很多分析器和復雜的標記器(德語單詞的分解分析)。每個節點越來越多的分片導致更多的批量線程處於活動狀態(節點上每個分片一個),並且它顯著提高了索引的速度。

出於好奇,你最終得到了每個節點有多少分片?我有一個類似的設置 - sebwebdev 18年11月14日在11:10

+50

剛從配置10 TB的日誌存儲中回來,讓我們談談分片:D

節點限制

主要來源:彈性搜索的權威指南

HEAP:最多32 GB

如果堆小於32 GB,JVM可以使用壓縮指針,這可以節省大量內存:每個指針4個字節而不是8個字節。

HEAP:最多50%的服務器內存其餘的留給文件系統緩存(因此64 GB服務器是一個常見的最佳位置):

Lucene充分利用了由內核管理的文件系統緩存。沒有足夠的文件系統緩存空間,性能將受到影響。此外,專用於堆的內存越多意味著使用doc值的所有其他字段的可用內存越少。

[索引拆分] N個分片可以將負載分散到N個服務器上

1個分片可以使用來自1個節點的所有處理能力(它就像一個獨立的索引)。對所有分片同時運行分片索引的操作,並對結果進行匯總。

更少的分片更好(理想的是1個分片)

分片的開銷很大。請參閱此基準數字https://blog.trifork.com/2014/01/07/elasticsearch-how-many-shards/

服務器越少越好(理想的是1台服務器(帶有1個分片)])

索引上的負載只能通過分片在節點之間拆分(分片足以使用節點上的所有資源)。更多的分片允許使用更多的服務器,但更多的服務器帶來更多的數據聚合開銷...沒有免費的午餐。

組態

用法:單一大指數

我們將所有內容放在一個大索引中,讓elasticsearch完成與分片數據相關的所有艱苦工作。應用程序中沒有任何邏輯,因此更容易開發和維護。

假設我們計劃將來索引最多為111 GB,並且我們的雲提供商有50 GB的服務器(25 GB堆)。

這意味著我們應該有5個分片。

注意:大多數人傾向於高估他們的成長,盡量做到現實。例如,這個111GB的例子已經是一個BIG索引。為了進行比較,stackoverflow索引是430 GB(2016),它是全球排名前50的站點,完全由數百萬人的書面文本組成。

用法:按時間索引

當單個索引的數據太多或管理起來太煩人時,接下來就是按時間段拆分索引。

最極端的例子是記錄每天使用新索引的應用程序(logstach和graylog)。

1-single-shard-per-index的理想配置在場景中非常有意義。如有必要,可以調整索引循環週期,以使索引保持小於堆。

特例:讓我們想像一個有月度指數的熱門互聯網論壇。99%的請求都是最後一個索引。我們必須設置多個分片(例如3個)以在多個節點上分散負載。(注意:這可能是不必要的優化。在現實世界中不太可能達到99%的命中率,並且分片副本無論如何都可以分配部分只讀負載)。

用法:進入Exascale(僅供記錄)

ElasticSearch很神奇。它是在集群中設置的最簡單的數據庫,它是極少數能夠擴展到許多節點(不包括Spanner)的數據庫之一。

有數百個彈性搜索節點可以進行exascale。必須有許多索引和分片才能在這麼多機器上分散負載,並採用適當的分片配置(最終根據索引進行調整)。

魔術的最後一點是將彈性搜索路由調整為針對特定操作的特定節點。


“因此64 GB服務器位於頂部,然後水平縮放”>這不是有效的聲明。你需要一台64 GB的機器來將堆最大化到不到32 GB(以獲得壓縮對象指針),但Elasticsearch和Lucene將從額外的內存中獲益,因為它可以將它用於文件系統緩存。如果你有256 GB的內存和只有一個運行30 GB堆的ES實例,那麼餘下的226 GB RAM可用於文件系統,ES將盡可能多地使用它,從而讓它的性能非常高好。 - pickypg 2016年7月24日0:50

沒錯,有超大64GB的大數據集是有道理的。它們並不常見,人們將不得不進行自己的基準測試,以發現它們的良好設置。一般來說,3 x 64 GB服務器提供96GB堆+ 96 GB緩存。這可以存儲大量數據,比大多數人擁有的數據更多。如果您故意在SINGLE節點上擁有256GB數據,那麼您只是犧牲了所有形式的冗餘,而且您的工作失敗了。 - user5994461 2016年7月24日14:29

我同意@pickypg。即使數據集較小,您也需要考慮如何使用它。例如,如果您大量使用聚合或進行全文搜索,Lucene和操作系統將使用額外的內存來存儲doc值和緩存段。當然,您還需要根據自己的用例分析和微調其他配置值。 - Ritesh 18年10月1日,1:14

0

我還沒有對此進行過測試,但是aws對ES最佳實踐有很好的了解查看選擇實例類型和測試部分。

0

如果您有可以按邏輯片段拆分的數據並且您的查詢通常是針對性的,那麼基於該邏輯進行分片以獲得“自定義路由”機制的好處是個好主意。

例如,您擁有50個州的房地產數據,並且總是按1個或多個州查詢,您將根據州名創建50個分片和路線。

你告訴Elasticsearch“嘿!而不是盲目地向所有分片廣播。搜索此分片上的數據!就在那裡,我保證!“ 例如,您可以根據state_code路由文檔。或者他們的郵政編碼或郵編。或者在您的應用程序中經常搜索/過濾的內容。

路由確保具有相同路由值的所有文檔將定位到相同的分片,從而無需廣播搜索。

有關詳細信息,請參閱此處:https//www.elastic.co/blog/customizing-your-document-routing

如果您的問題適合自定義路由服務的利基,這可能會顯著提高性能。

48
votes
answers
15 views
+10

Elasticsearch Filtered query vs Filter [duplicate]

This question already has an answer here:

Is there any difference between "query and filter in filtered" and "query and filter on the root"? for example

Case 1:

{
  "query":{
    "filtered":{
      "query":{
        "term":{"title":"kitchen3"}
      },
      "filter":{
        "term":{"price":1000}
      }
    }
  }
}

Case 2:

{
  "query":{
    "term":{"title":"kitchen3"}
  },
  "filter":{
    "term":{"price":1000}
  }
}

I found this discussion http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using-filter-outside-td3960119.html, but referenced URL is 404 and the explanation is a bit too concise for me.

Please teach or give any document which is pointing the difference between these, thank you.

up vote 39 down vote accepted favorite
沙发
+390
+50

差異與績效有關。頂層的“過濾器”始終查詢執行這意味著對所有文檔執行查詢,計算所有文檔的分數等 - 並且僅排除不匹配過濾器的文檔。

使用“過濾”查詢,ES可能會優化此計算,例如,首先執行過濾器,然後對有限的文檔集執行查詢,從而節省測試與查詢不匹配的文檔的時間,以及如果它們與查詢匹配,則為它們計算得分。

如果使用相同的過濾器執行多個查詢,則還有更多優點:可以緩存過濾器,從而進一步提高每個查詢的性能。這適用於您的示例:默認情況下會緩存“term”過濾器。

您還可以顯式控制“已過濾”查詢的執行(請參閱文檔),以針對您的特定用例對其進行優化。

如果我在查詢之前編寫過濾器,那麼你能否在過濾查詢中告訴我那麼它會不會對性能產生任何影響? - Sudhanshu Gaur 2015年9月22日9:02

@SudhanshuGaur查詢JSON中鍵的順序不影響結果。您可以控制可影響性能的過濾策略:elastic.co/guide/en/elasticsearch/reference/current/... - Alexey Tigarev 2015年9月23日4:52

+90

兩種類型的過濾器也可稱為前置和後置過濾器。正如@alexey所解釋的那樣,在查詢之後執行根級別過濾,並在查詢之前執行過濾查詢中的過濾。

此外,您需要了解相同的其他影響,然後執行它們的順序。“篩選”查詢中的篩選器位於查詢範圍內,這意味著在計算聚合時,將考慮篩選的輸出,而在根級別篩選器的情況下,將僅對除篩選器之外的查詢結果執行聚合。雖然在這兩種情況下結果文件都是相同的。

例如,對於您發布的兩個查詢,兩者都會給出相同的結果,但如果您正在執行聚合,則第一個查詢將計算來自匹配標題kitchen3和price 10000的文檔的聚合計數,而第二個查詢將計算來自匹配標題的文檔的聚合計數kitchen3只有沒有價格1000的過濾器。

“過濾查詢中的過濾器在查詢之前執行” - 沒必要 - Alexey Tigarev 2015年9月23日4:55

84
votes
answers
10 views
+10

Dump all documents of Elasticsearch

Is there any way to create a dump file that contains all the data of an index among with its settings and mappings?

A Similar way as mongoDB does with mongodump
or as in Solr its data folder is copied to a backup location.

Cheers!

up vote 34 down vote accepted favorite
沙发
+340
+50

雖然非常方便,但快照並沒有真正以可用的格式(json,csv等)導出數據--Evan 2014年11月18日3:24

@Andreas Neumann Can快照功能可以備份索引中的文檔子集。假設一個索引有1000個文檔,我想只備份500個文檔。我想這樣做是因為我想導入一組文檔並在其他索引中恢復以進行一些負載測試。我不需要所有文檔來完成我的任務和索引是巨大的,我不想拍攝所有數據的快照,因為它需要花費很多時間 - Sanjeev Kumar Dangi 2015年5月19日13:12

+380

這是我們為此目的而努力的新工具https://github.com/taskrabbit/elasticsearch-dump您可以將索引導出/導出JSON文件,或從一個群集導出到另一個群集。

謝謝Evan,這很完美。我喜歡它讓我們處理普通json文件的方式。 - NullPointer 2015年1月30日6:06

我試過這個。而索引數據是112Mb。以json格式導出的數據是337MB的3倍,耗時40分鐘。我不知道它的索引太大了,它看起來真的很實用。什麼是針對ES提供的快照功能的基準測試。 - Sanjeev Kumar Dangi 2015年5月19日13:10

@Evan的elasticdump內部使用ElasticSearch的掃描和滾動功能嗎? - Sanjeev Kumar Dangi 2015年5月19日13:15

@sanjeev絕對! - Evan 2015年5月19日15:01

謝謝Evan的回复。請回复我關於快照性能基準的第二條評論。 - Sanjeev Kumar Dangi 2015年5月20日5:15

+100

ElasticSearch本身提供了一種創建數據備份和恢復的方法。執行此操作的簡單命令是:

CURL -XPUT 'localhost:9200/_snapshot/<backup_folder name>/<backupname>' -d '{
    "indices": "<index_name>",
    "ignore_unavailable": true,
    "include_global_state": false
}'

現在,如何創建這個文件夾,如何在ElasticSearch配置中包含這個文件夾路徑,以便它可用於ElasticSearch,恢復方法,這裡有很好的解釋這裡看看它的實用演示衝浪

太棒了,謝謝 - bigbadmouse 5月20日16:34

+20

數據本身是一個或多個lucene索引,因為您可以有多個分片。您還需要備份的是群集狀態,其中包含有關群集的所有類型的信息,可用的索引,它們的映射,它們由它們組成的碎片等。

它都在data目錄中,你可以復制它。它的結構非常直觀。在復制之前,最好禁用自動刷新(為了備份索引的一致視圖並避免在復製文件時對其進行寫入),請發出手動刷新,禁用分配。請記住從所有節點複製目錄。

此外,elasticsearch的下一個主要版本將提供一個新的快照/恢復api,允許您執行增量快照並通過api恢復它們。這是相關的github問題:https//github.com/elasticsearch/elasticsearch/issues/3826

事實上我已經嘗試過這個解決方案而且對我來說不起作用。我按照你說的那樣複製數據文件夾到新的遠程安裝,我試著啟動ES,但是由於異常而死了。不幸的是我沒有日誌粘貼它。你的解決方案成功嗎? - Evan P 2013年10月9日12:00

是的,你應該怎麼做。您是否嘗試將索引還原到相同的elasticsearch版本?同類機器?這是一個大指數嗎?單節點? - javanna 2013年10月9日12:19

它是一個單節點,5個分片,一個小索引(~2k文件)但不同的機器。版本相同(0.9) - Evan P 2013年10月10日7:58

0

您還可以通過http請求以JSON格式轉儲elasticsearch數據:https//www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
CURL -XPOST 'https://ES/INDEX/_search?scroll=10m'
CURL -XPOST 'https://ES/_search/scroll' -d '{"scroll": "10m", "scroll_id": "ID"}'

0
votes
answers
45 views
+10

「where .. in」模擬elasticsearch與Java API

0

我是ElasticSearch的新手。 我在我的User類中有一個字符串字段,代表UserStatus,我需要搜索處於特定狀態的所有用戶。 在關係數據庫中,它完全是「where .. in」。「where .. in」模擬elasticsearch與Java API

我看到的例子,使用termsQuery在不同的組合,但我沒有設法使他們工作(查詢返回什麼都沒有)。

所以,問題是:有沒有鏈接,顯示整個例子或某人面臨這樣的問題? 任何幫助都很高興!

//實體本身

@AllArgsConstructor 
    @NoArgsConstructor 
    @Data 
    @Builder 
    @Document(indexName = "users", type = "user") 
    public class User { 

     @Id 
     private String id; 

     private String userStatus; 
     private String firstName; 
     private String lastName; 
     private Date dateCreated; 
    } 

//一個彈簧服務方法

@Override 
public List<User> findByParams(UserSearchRequest userSearchRequest) { 

    TermsQueryBuilder termsQueryBuilder = QueryBuilders 
      .termsQuery("userStatus", userSearchRequest.getUserStatuses()); 


    SearchQuery searchQuery = new NativeSearchQueryBuilder() 
      .withQuery(boolQuery().must(termsQueryBuilder)) 
      .withPageable(new PageRequest(0, 100)) 
      .build(); 


    return Lists.newArrayList(userRepository.search(searchQuery)); 

} 

// REST請求對象

@AllArgsConstructor 
@NoArgsConstructor 
@Data 
public class UserSearchRequest { 
    private List<String> userStatuses; 
} 
+1

你嘗試運行直接查詢到elasticsearch(捲曲或某種基於Web的用戶界面),而不是通過Java ?通常這就是幫助我 – sfat

+0

我同意@sfat,嘗試與直接彈性搜索查詢。以下是基於特定條件檢索值的查詢。 – Sree

+0

下面是一個查詢{「query」:{「constant_score」:{「filter」:{「bool」:{「should」:[{「term」:{「employee」:「foo」}}]}} }}}。方法 - >發佈,網址 - > http:// localhost:9200///_search。 – Sree

沙发
0
0

檢查Elasticsearch的文檔"Finding Multiple Exact Values"

基本上,您需要將自己的術語搜索到一個常數分數查詢中。

從Elasticsearch DOC(保留給後人)

GET /my_store/products/_search 
{ 
    "query" : { 
     "constant_score" : { 
      "filter" : { 
       "terms" : { 
        "price" : [20, 30] 
       } 
      } 
     } 
    } 
} 

這個例子說,搜索的有價產品20或30

你需要的是搜索所有具有用戶userStatus您作爲List傳遞的任一值。

在你需要改變你的NativeSearchQueryBuilder在這樣的實施方面:

SearchQuery searchQuery = new NativeSearchQueryBuilder() 
       .withQuery(constantScoreQuery(termsQueryBuilder)) 
       .withPageable(new PageRequest(0, 100)) 
       .build(); 
80
votes
answers
11 views
+10

low disk watermark [??%] exceeded on

I use Elasticsearch 1.4.4 in my development machine (a single notebook). Everything is set as default because I never changed any settings.

When I start it, I usually get the following message:

[2015-10-27 09:38:31,588][INFO ][node                     ] [Milan] version[1.4.4], pid[33932], build[c88f77f/2015-02-19T13:05:36Z]
[2015-10-27 09:38:31,588][INFO ][node                     ] [Milan] initializing ...
[2015-10-27 09:38:31,592][INFO ][plugins                  ] [Milan] loaded [], sites []
[2015-10-27 09:38:34,665][INFO ][node                     ] [Milan] initialized
[2015-10-27 09:38:34,665][INFO ][node                     ] [Milan] starting ...
[2015-10-27 09:38:34,849][INFO ][transport                ] [Milan] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/10.81.1.108:9300]}
[2015-10-27 09:38:35,022][INFO ][discovery                ] [Milan] elasticsearch/DZqnmWIZRpapZY_TPkkMBw
[2015-10-27 09:38:38,787][INFO ][cluster.service          ] [Milan] new_master [Milan][DZqnmWIZRpapZY_TPkkMBw][THINKANDACT1301][inet[/10.81.1.108:9300]], reason: zen-disco-join (elected_as_master)
[2015-10-27 09:38:38,908][INFO ][http                     ] [Milan] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/10.81.1.108:9200]}
[2015-10-27 09:38:38,908][INFO ][node                     ] [Milan] started
[2015-10-27 09:38:39,220][INFO ][gateway                  ] [Milan] recovered [4] indices into cluster_state
[2015-10-27 09:39:08,801][INFO ][cluster.routing.allocation.decider] [Milan] low disk watermark [15%] exceeded on [DZqnmWIZRpapZY_TPkkMBw][Milan] free: 58.6gb[12.6%], replicas will not be assigned to this node
[2015-10-27 09:39:38,798][INFO ][cluster.routing.allocation.decider] [Milan] low disk watermark [15%] exceeded on [DZqnmWIZRpapZY_TPkkMBw][Milan] free: 58.6gb[12.6%], replicas will not be assigned to this node
[2015-10-27 09:40:08,801][INFO ][cluster.routing.allocation.decider] [Milan] low disk watermark [15%] exceeded on [DZqnmWIZRpapZY_TPkkMBw][Milan] free: 58.6gb[12.6%], replicas will not be assigned to this node
....

I see a lot of these "low disk watermark ... exceeded on..." messages. What went wrong in my case? How to fix it? Thanks!

UPDATE

Before this post, I searched SO for related posts. I found one related to "high watermark..." and in that case, the disk space is low. In my case, I checked and there is still 56GB left on my disk.

UPDATE

According to the input from Andrei Stefan, I need to change settings. Should I do it the following way:

curl -XPUT localhost:9200/_cluster/settings -d '{
    "transient" : {
        "cluster.routing.allocation.disk.threshold_enabled" : false
    }
}'

Or is there any settings file I can edit to set it?

up vote 56 down vote accepted favorite
沙发
+560
+50

如果你喜歡我有很多磁盤你可以調整水印設置並使用字節值而不是百分比:

NB!您不能在這些設置中混合使用百分比值和字節值。全部都設置為百分比值,或全部設置為字節值。

設定cluster.routing.allocation.disk.watermark.low

控制磁盤使用的低水位線。它默認為85%,這意味著一旦使用超過85%的磁盤,ES將不會為節點分配新的分片。它也可以設置為絕對字節值(如500mb),以防止ES在小於配置的可用空間量時分配分片。

設定cluster.routing.allocation.disk.watermark.high

控制高水印。默認為90%,這意味著如果節點磁盤使用率超過90%,ES將嘗試將分片重定位到另一個節點。它也可以設置為絕對字節值(類似於低水印),以便重新定位分片,一次小於節點上可用的配置空間量。

設置 ::cluster.routing.allocation.disk.watermark.flood_stage

控制洪水階段水印。它默認為95%,這意味著Elasticsearch對每個索引強制執行只讀索引塊(index.blocks.read_only_allow_delete),該索引在至少有一個磁盤超過泛洪階段的節點上分配了一個或多個分片。這是防止節點耗盡磁盤空間的最後手段。一旦有足夠的可用磁盤空間允許索引操作繼續,就必須手動釋放索引塊。

https://www.elastic.co/guide/en/elasticsearch/reference/current/disk-allocator.html

請注意:

百分比值是指已用磁盤空間,而字節值是指可用磁盤空間。這可能令人困惑,因為它顛覆了高低的含義。例如,將低水印設置為10gb,將高水印設置為5gb是有意義的,但不是相反。

在我的5TB磁盤上,我設置了:

# /etc/elasticsearch/elasticsearch.yml
cluster.routing.allocation.disk.threshold_enabled: true
cluster.routing.allocation.disk.watermark.flood_stage: 5gb
cluster.routing.allocation.disk.watermark.low: 30gb
cluster.routing.allocation.disk.watermark.high: 20gb

編輯:添加cluster.routing.allocation.disk.watermark.flood_stage為pr其他答案。

請注意,cluster.routing.allocation.disk.threshold_enabled:True應該是cluster.routing.allocation.disk.threshold_enabled:true(沒有大寫字母T) - seinecle 2017年4月25日21:35

嚴格來說,這不是一個錯誤 - 意味著真實和真實都有效,即使java標準要去大寫。在撰寫本文時,手頭的問題比堅持編碼風格更重要 - 我會假設。已經有一段時間...... - sastorsl 2017年5月4日18:13

我認為在我的情況下它不起作用,這就是我評論的原因。 - 圍網2017年5月10日11:52

請注意,如果要設置百分比,則應該是比率。例如cluster.routing.allocation.disk.watermark.low:0.95 - arno_v 2017年5月24日11:29

還有另一個相關的設置cluster.routing.allocation.disk.watermark.flood_stage,高於水印。即在上面的例子中,它必須<20gb。 - 布魯斯亞當斯1月15日13:39

+200

我知道這是老帖子,但我的評論可以讓別人開心。要以字節值(gb或mb)指定水印,您必須將cluster.routing.allocation.disk.watermark.flood_stage添加到elasticsearch設置文件 - elasticsearch.yml。完整的例子:

  cluster.routing.allocation.disk.threshold_enabled: true 
  cluster.routing.allocation.disk.watermark.flood_stage: 200mb
  cluster.routing.allocation.disk.watermark.low: 500mb 
  cluster.routing.allocation.disk.watermark.high: 300mb

注意:如果沒有指定cluster.routing.allocation.disk.watermark.flood_stage,它將無法使用字節值(gb或mb)

是的,沒有cluster.routing.allocation.disk.watermark.flood_stage就是肚子了。 - kghbln 18年7月12日14:09

+40

我在elasticsearch.yaml文件中添加了以下行(elastic_search_folderconfig):

cluster.routing.allocation.disk.threshold_enabled: true
cluster.routing.allocation.disk.watermark.low: 93%
cluster.routing.allocation.disk.watermark.high: 95%

出於某種原因,在gb中指定水印就像在另一個答案中那樣對我不起作用。另外,確保您watermark.high的洪水水印小於或等於洪水水印(通常設置為95%)。

你能告訴我你在運行什麼版本嗎?謝謝 !截尾日期18年1月13日截止到1:44

@ CensoredP.Censored Hey,6.1.1 - Ivan Yurchenko 18年2月13日17:41

你必須設置所有4個設置,你不能混合百分比+ mb / gb。您錯過了cluster.routing.allocation.disk.watermark.flood_stage設置,該設置可能阻止您使用mb / gb設置。 - slm 5月13日16:36

65
votes
answers
20 views
+10

Create or update mapping in elasticsearch

I am new to Elasticsearch and am currently working on implementing a geo_distance filter for searching. As of now my index has the following mapping (I've removed some fields):

{
advert_index: {
   mappings: {
      advert_type: {
         properties: {
            __v: {
               type: "long"
            },
            caption: {
               type: "string"
            },
            category: {
               type: "string"
            },
            **location: {
            type: "long"
            },**

         }
      }
   }
}

The geo_distance field is going to be implemented on the location field, where an example instance looks like this:

"location": [
               71,
               60
            ],

I.e. is on geoJSON format [lon, lat].

I understand that I will have to update my index so that the location field is of type geo_point, as described in the documentation (mapping-geo-point). It seems like I have to drop the index and create a new one, but I am not able to do this.

Am I on the right track? I would greatly appreciate it if anyone could help me with how I could create a new index or update my existing one with the correct data type.

Many thanks!

up vote 60 down vote accepted favorite
沙发
+600
+50

一般來說,您可以使用put mapping api 更新索引映射此處引用):

curl -XPUT 'http://localhost:9200/advert_index/_mapping/advert_type' -d '
{
    "advert_type" : {
        "properties" : {

          //your new mapping properties

        }
    }
}
'

它對添加新字段特別有用。但是,在您的情況下,您將嘗試更改位置類型,這將導致衝突並阻止使用新映射。

您可以使用put mapping api 包含該位置的另一個屬性添加為lat / lon數組,但是您將無法更新以前的位置字段本身。

最後,您必須重新索引數據,以便將新映射重新考慮在內。

最好的解決方案是創建一個新索引

如果您創建另一個索引的問題是停機時間,那麼您應該查看別名以使事情順利進行。

謝謝Tom的快速回答。具體如何創建一個具有正確位置類型的新索引?我目前處於開發環境中,因此停機等不是問題。我一直在使用此代碼創建索引:鏈接(在底部) - Axelfran 2014年8月24日在13:33

我不熟悉mongoDB河,但從我看到的河流是基於動態映射(ES自動檢測要應用的映射,基於值)。您可以通過手動創建索引及其映射來控制此操作,然後用新創建的索引名稱/類型名稱替換ARBITRARY INDEX NAME和ARBITRARY TYPE NAME。您應該為此創建一個新問題,因為它是一個單獨的主題。 - ThomasC 2014年8月24日14:00

下面提供的方法就像一個魅力。非常感謝! - Axelfran 2014年8月24日15:49

是否可以創建新索引但保存存儲的文檔? - Ricardo Polo 2016年5月11日16:59

看一下2.3中引入的reindex API:應該做的訣竅:) - ThomasC 2016年5月26日9:08

+50

請注意,此答案中提供的網址存在錯誤:

對於PUT映射請求:url應如下所示:

HTTP://本地主機:9200 / name_of_index / _mappings / DOCUMENT_TYPE

並不是

HTTP://本地主機:9200 / name_of_index / DOCUMENT_TYPE / _mappings

這取決於您使用的Elasticsearch版本。例如,版本0.90使用了您認為無效的符號:elastic.co/guide/en/elasticsearch/reference/0.90 / ... - Sicco 2016年3月22日18:34

91
votes
answers
14 views
+10

elasticsearch: how to free store size after deleting documents

On my elasticsearch server: total documents: 3 million, total size: 3.6G Then, I delete about 2.8 millions documents: total documents: about 0.13 million, total size: 3.6G

I have deleted the documents, how should I free the size of the documents?

up vote 72 down vote accepted favorite
沙发
+720
+50

刪除文檔只會將這些標記為已刪除,因此不會搜索它們。要回收磁盤空間,您必須優化索引:

curl -XPOST 'http://localhost:9200/_optimize?only_expunge_deletes=true'

文檔:http//www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-optimize.html

更新

與Elasticsearch 2.1.x的開始,optimize 已廢棄青睞 forcemergeAPI是相同的,只有端點確實發生了變化。

curl -XPOST 'http://localhost:9200/_forcemerge?only_expunge_deletes=true'

克努特的回答是正確的。這篇文章詳細介紹了為什麼會這樣:found.no/foundation/elasticsearch-from-the-bottom-up - Alex Brasetvik 2013年12月16日11:37

你們兩個都很有幫助。非常感謝! - 丹尼爾2013年12月17日凌晨2點16分

我同意,這是一個很的答案,但你需要多少空間才能刪除已刪除的文件?我正在運行上述命令,目前(仍在運行)索引增加了10 Gig。 - Danielson 2015年10月26日15:15

該指數分為幾個部分。優化將合併這些段,同時刪除過程中刪除的文檔。在合併期間複製索引數據,這是增加的來源。最壞的情況合併在合併期間需要2倍的當前索引大小,這樣的大合併很可能需要數小時。 - knutwalker 2015年10月26日16:16

@knutwalker感謝更新 - Maziyar 2015年11月28日20:01_

+180

在當前的elasticsearch版本(5.4)中,

  1. 優化所有指數:

    POST /_all/_forcemerge?only_expunge_deletes=true

  2. 優化單一索引

    POST /twitter/_forcemerge?only_expunge_deletes=true ,twitter是索引

參考:https//www.elastic.co/guide/en/elasticsearch/reference/5.4/indices-forcemerge.html#indices-forcemerge

+10

knutwalker的回答是正確的。但是,如果您正在使用AWS ElasticSearch並希望釋放存儲空間,那麼這將無法正常工作。

在AWS上,必須在URL中指定forgemerge的索引。它可以包括通配符,這與索引旋轉一樣。

curl -XPOST 'https://something.es.amazonaws.com/index-*/_forcemerge?only_expunge_deletes=true'

AWS發布了ElasticSearch API差異列表