我正在尝试使用 elasticsearch 路由映射来加快一些查询,但我没有得到预期的结果集(还不担心查询性能)
我正在使用 Elastic 来设置我的映射:
$index->create(array('number_of_shards' => 4,
'number_of_replicas' => 1,
'mappings'=>array("country"=>array("_routing"=>array("path"=>"countrycode"))),
'analysis' => array(
'analyzer' => array(
'indexAnalyzer' => array(
'type' => 'keyword',
'tokenizer' => 'nGram',
'filter' => array('shingle')
),
'searchAnalyzer' => array(
'type' => 'keyword',
'tokenizer' => 'nGram',
'filter' => array('shingle')
)
)
) ), true);
如果我理解正确,应该发生的是每个结果现在应该有一个名为“countrycode”的字段,其中包含“country”的值。
_mapping 的结果如下所示:
{"postcode":
{"postcode":
{"properties":
{
"area1":{"type":"string"},
"area2":{"type":"string"},
"city":{"type":"string",
"include_in_all":true},
"country":{"type":"string"},
"country_iso":{"type":"string"},
"country_name":{"type":"string"},
"id":{"type":"string"},
"lat":{"type":"string"},
"lng":{"type":"string"},
"location":{"type":"geo_point"},
"region1":{"type":"string"},
"region2":{"type":"string"},
"region3":{"type":"string"},
"region4":{"type":"string"},
"state_abr":{"type":"string"},
"zip":{"type":"string","include_in_all":true}}},
"country":{
"_routing":{"path":"countrycode"},
"properties":{}
}
}
}
如果我运行此命令,一旦所有数据都在索引中:
http://localhost:9200/postcode/_search?pretty=true&q=country:au
它以 15740 个项目响应
我所期待的是,如果我像这样运行查询:
http://localhost:9200/postcode/_search?routing=au&pretty=true
然后我期待它以 15740 结果响应
相反,它返回 120617 个结果,其中包括国家/地区为 != au 的结果
我确实注意到结果中的分片数量从 4 变为 1,所以有些东西在起作用。
我期待在结果集中会有一个名为“countrycode”的项目(来自路由映射),但没有
所以我在这一点上认为我对路由的理解是错误的。也许路由所做的只是告诉它要查找哪个分片,而不是要查找什么?换句话说,如果其他国家/地区代码恰好也落在该特定分片中,那么这些查询的编写方式只会带回该分片中的所有记录?
所以我再次尝试了查询,这次添加了一些信息。
http://localhost:9200/postcode/_search?routing=AU&pretty=true&q=country:AU
我认为这样做会强制查询只给我 AU 地名,但这次它只给了我 3936 个结果
所以我不太确定我做错了什么,我读过的示例显示查询从需要过滤器变为仅使用 match_all{},我认为这只会是匹配 au 国家/地区代码的查询。
感谢您帮助使其正常工作。
几乎可以正常工作,现在它在单个分片中为我提供了正确数量的结果,但是创建索引工作不正常,它忽略了我的 number_of_shards 设置,可能还有其他设置
$index = $client->getIndex($indexname);
$index->create(array('mappings'=>array("$indexname"=>array("_routing"=>array("required"=>true))),'number_of_shards' => 6,
'number_of_replicas' => 1,
'analysis' => array(
'analyzer' => array(
'indexAnalyzer' => array(
'type' => 'keyword',
'tokenizer' => 'nGram',
'filter' => array('shingle')
),
'searchAnalyzer' => array(
'type' => 'keyword',
'tokenizer' => 'nGram',
'filter' => array('shingle')
)
)
) ), true);