因此,假设我在弹性搜索索引中索引了所有 30-40 列,是否真的可以搜索一个词或多个词,其性能大致与一组 RDBMS 索引一样?
简而言之,是的。
在 Elasticsearch 中,首选的方法是使用filter,假设这些字段/列包含“枚举”类型的数据(例如status
、gender
、department
等),并且您不想使用全文搜索来查询它们. (添加全文搜索很简单,但需要您提前考虑适当的分析器、用户搜索模式等主题)
假设您在term
这里使用过滤器:
curl localhost:9200 -d '{
"query" : {
"filtered" : {
"filter" : {
"term" : {
"department" : "marketing"
}
}
}
}
}'
现在,terms 过滤器会生成一个 bitset,如果特定文档与此过滤器匹配(1/0),则该 bitset 会存储信息。这个 bitset 具有三个重要的特性:a) 它非常紧凑,b) 它非常可缓存,c) 它允许 bitset 操作组合过滤器。
Elasticsearch 将使用过滤器缓存来加快对该过滤器的访问。
过滤器和位集的好处是,如果您要进行稍微不同的查询:
curl localhost:9200 -d '{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"must": [
"term" : {
"department" : "marketing"
},
"term" : {
"status" : "active"
}
]
}
}
}
}
}'
部门字段上的过滤器将被重新使用并从缓存中加载,将在状态字段上创建一个新的缓存位集,下一次,两者都将从缓存中加载并使用位集操作进行评估。
Elasticsearch 提供了一个Warmer API,因此您可以使用已知查询非常有效地“预加载”您的缓存。
过滤器缓存的统计信息是Nodes Stats API的一部分。