4

ライブデータのフィルタリングにelasticsearchを使用しようとしています。現在、新しいデータを常に (_bulk 経由で 3 秒ごとに) プッシュする単一のマシンを使用しています。それでも、1 日ほどでインデックスがかなり大きくなり、elasticsearch がハングするように ttl を設定しました。私の現在のマッピング:

curl -XPOST localhost:9200/live -d '{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0,
    "analysis": {
      "analyzer": {
        "lowercase_keyword": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": [
            "lowercase"
          ]
        },
        "no_keyword": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": []
        }
      }
    }
  },
  "mappings": {
    "log": {
      "_timestamp": {
        "enabled": true,
        "path": "datetime"
      },
      "_ttl":{
        "enabled":true,
        "default":"8h"
      },
      "properties": {
        "url": {
          "type": "string",
          "search_analyzer": "lowercase_keyword",
          "index_analyzer": "lowercase_keyword"
        },
        "q": {
          "type": "string",
          "search_analyzer": "no_keyword",
          "index_analyzer": "no_keyword"
        },
        "datetime" : {
          "type" : "date"
        }
      }
    }
  }
}'

問題は古いドキュメントのパージだと思いますが、間違っている可能性があります。セットアップを最適化する方法についてのアイデアはありますか?

4

1 に答える 1

9

Elasticsearchのハングを回避するには、Javaプロセスで使用できるメモリの量を増やすことをお勧めします。

すべてのドキュメントの寿命が同じである場合は、ttlの代わりにローリングエイリアスを使用する方が効率的かもしれません。基本的な考え方は、新しいインデックスを定期的に(たとえば、1時間ごとに)作成し、エイリアスを使用して現在のインデックスを追跡することです。時間の経過とともに、検索するエイリアスのインデックスのリストを更新し、8時間以上のインデックスを削除することができます。インデックスの削除は、ttlを使用してインデックスを削除するよりもはるかに高速です。ローリングエイリアスのセットアップを作成する方法を示すサンプルコードは、ここにあります。

保持しようとしているライブデータの量はよくわかりませんが、一連のクエリに対して受信データをテストするだけの場合は、データのインデックスを作成する代わりにPercolateAPIの使用を検討することもできます。

于 2012-04-30T10:49:57.807 に答える