0

我正在尝试使用 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); 
4

1 回答 1

3

我至少可以为您提供有关在哪里查看的更多信息:

http://localhost:9200/postcode/_search?routing=au&pretty=true

该查询确实转换为“给我分片上的所有文件,国家:AU 的文件应该被发送到该文件。”

路由就是这样,路由......它不会为您过滤结果。

我还注意到你正在混合你的“au”和你的“AU”......这也可能把事情搞混了。

您应该尝试将您的路由元素上的 required 设置为 true,以确保您的文档在被索引时实际存储有路由信息。

实际上,为了确保您的文档使用正确的路由进行索引,在索引文档时将路由显式设置为小写(国家代码)。看看是否有帮助。

有关更多信息,请尝试阅读此博客文章:

http://www.elasticsearch.org/blog/customizing-your-document-routing/

希望这可以帮助 :)

于 2013-08-01T07:14:01.480 回答