4

我正在尝试使用 elasticsearch 进行实时数据过滤。现在我使用一台不断推送新数据的机器(每 3 秒通过 _bulk)。即便如此,我确实设置了一个 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 进程可用的内存量。

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

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

于 2012-04-30T10:49:57.807 回答