我正在尝试使用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"
}
}
}
}
}'
我认为问题是清除旧文件,但我可能是错的。关于如何优化我的设置的任何想法?
答案 0 :(得分:9)
为避免弹性搜索挂起,您可能希望增加java进程可用的内存量。
如果所有文档的生命周期都相同,则使用滚动aliases代替ttl可能更有效。基本思想是定期(例如每小时)创建一个新索引,并使用别名来跟踪当前索引。随着时间的推移,您可以更新搜索别名中的索引列表,只需删除超过8小时的索引。删除索引要比使用ttl删除索引快得多。可以找到演示如何创建滚动别名设置的示例代码here。
我不太确定您要保留多少实时数据,但如果您只是针对一组查询测试传入数据,您可能还会考虑使用Percolate API而不是索引数据。