假设我在企业环境中有一个包含30-40列的旧RDBMS表,主要用于搜索目的。在现实生活中可能有几个表,但让我们保持简单。我有几十个,甚至几百个不同的程序,每个程序都对这个表执行自己的查询,每个程序都会查看一组略有不同的字段。
啊...
因此,假设我将弹性搜索索引中的所有30-40列都编入索引,我是否能够以与一组RDBMS索引大致相同的方式搜索一个或多个词?
答案 0 :(得分:4)
因此,假设我将弹性搜索索引中的所有30-40列都编入索引,我是否能够以与一组RDBMS索引大致相同的方式搜索一个或多个词?
简而言之,是的。
在Elasticsearch中,首选的方法是使用过滤器,假设这些字段/列包含“枚举”类型的数据(例如status
,gender
,department
等,并且您不想使用全文搜索来查询它们。 (添加全文搜索会很简单,但需要事先考虑适当的分析器,用户搜索模式等主题。)
假设您在此处使用term
过滤器:
curl localhost:9200 -d '{
"query" : {
"filtered" : {
"filter" : {
"term" : {
"department" : "marketing"
}
}
}
}
}'
现在,术语过滤器生成一个bitset,用于存储特定文档是否与此过滤器匹配的信息(1/0)。这个bitset有三个重要的特性:a)它非常紧凑,b)它是非常可缓存的,c)它允许bitset操作组合过滤器。
Elasticsearch将使用filter cache来加快对此过滤器的访问。
关于过滤器和位集的好处是,如果你要做一个稍微不同的查询:
curl localhost:9200 -d '{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"must": [
"term" : {
"department" : "marketing"
},
"term" : {
"status" : "active"
}
]
}
}
}
}
}'
部门字段上的过滤器将被重新使用并从缓存中加载,将在状态字段上创建一个新的缓存位集,并且下次两者都将从缓存加载并使用bitset操作进行评估。
Elasticsearch提供了Warmer API,因此您可以使用已知查询非常有效地“预加载”缓存。
过滤器缓存的统计信息是Nodes Stats API。
的一部分