弹性搜索中实时数据的最佳设置

时间:2012-04-30 06:49:33

标签: elasticsearch

我正在尝试使用elasticsearch进行实时数据过滤。现在我使用一台机器不断推送新数据(通过_bulk每隔3秒)。即便如此,我确实设置了一个ttl,索引在一天左右后变得非常大,然后elasticsearch挂起。我目前的映射:

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"
        }
      }
    }
  }
}'

我认为问题是清除旧文件,但我可能是错的。关于如何优化我的设置的任何想法?

1 个答案:

答案 0 :(得分:9)

为避免弹性搜索挂起,您可能希望增加java进程可用的内存量。

如果所有文档的生命周期都相同,则使用滚动aliases代替ttl可能更有效。基本思想是定期(例如每小时)创建一个新索引,并使用别名来跟踪当前索引。随着时间的推移,您可以更新搜索别名中的索引列表,只需删除超过8小时的索引。删除索引要比使用ttl删除索引快得多。可以找到演示如何创建滚动别名设置的示例代码here

我不太确定您要保留多少实时数据,但如果您只是针对一组查询测试传入数据,您可能还会考虑使用Percolate API而不是索引数据。