shared index
我们可以考虑采用一个大的集群来放这些数据,然后通过一个标记来filter这些数据
PUT /forums
{
"settings": {
"number_of_shards": 10
},
"mappings": {
"post": {
"properties": {
"forum_id": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
PUT /forums/post/1
{
"forum_id": "baking",
"title": "Easy recipe for ginger nuts",
...
}
我们可以使用forum_id 作为filter搜索单独的forum,这个filter将排除其他文档,并且filter将cache,保证response的快速
GET /forums/post/_search
{
"query": {
"filtered": {
"query": {
"match": {
"title": "ginger nuts"
}
},
"filter": {
"term": {
"forum_id": {
"baking"
}
}
}
}
}
}
这个方法起作用了,但每次系统做这样的事情的时候得先对所有的shard进行filter(也就是说数据分别放在不同的shard上了),这样的效率还不是最好。
在routing a Document to a shard中我们阐述了一个文档被分配到了一个特殊的shard上。
shard = hash(routing) % number_of_primary_shards
routing的默认值就是_id,但是我们可以重载这个值,变为我们自己的值,例如forum_id,所有的文档通过routing被routing到相同的shard上
PUT /forums/post/1?routing=baking
{
"forum_id": "baking",
"title": "Easy recipe for ginger nuts",
...
}
当我们进行查询的时候我们可以通过设置routing值去确保所有的搜索请求都指向了这个shard(是否可以考虑现在index 加入这个值,search先不加,慢慢转化)
GET /forums/post/_search?routing=baking
{
"query": {
"filtered": {
"query": {
"match": {
"title": "ginger nuts"
}
},
"filter": {
"term": {
"forum_id": {
"baking"
}
}
}
}
}
}
多个routing请求
GET /forums/post/_search?routing=baking,cooking,recipes
{
"query": {
"filtered": {
"query": {
"match": {
"title": "ginger nuts"
}
},
"filter": {
"terms": {
"forum_id": {
[ "baking", "cooking", "recipes" ]
}
}
}
}
}
}
这种办法是非常高效的,但感觉有点笨拙。因为每个请求都得加routing和term filter请求,index aliases来解决这个问题!