使用ElasticSearch搜索全球位置名称的有效方法是什么?
我有通过解析到关系数据库提供的位置信息。利用这些信息,我试图建立一个ElasticSearch索引,其中包含人口稠密的地方(城市)名称、行政区划(州、省等)名称、国家名称和国家代码。我的目标是提供类似于谷歌地图的位置搜索: 我不需要很酷的粗体突出显示,但我确实需要搜索以类似的方式返回类似的结果。我尝试过用一个位置字段创建一个映射,该字段由整个位置名称组成(例如,“德克萨斯州圆岩镇),我还尝试过用五个单独的字段组成一个位置的每个部分。我尝试过关键字和前缀查询以及edgengram分析器;我一直未能找到正确的配置以使其正常工作 为了实现我的目标,我应该使用什么样的分析器——索引和搜索?这个搜索不必像谷歌那样完美,但我希望它至少是类似的 我确实希望支持部分名称匹配,这就是为什么我一直在摆弄EdgeGram。例如,搜索“round r”应与美国德克萨斯州的round Rock匹配。此外,我更希望填充的地名(城市)以精确搜索词开头的结果排名高于其他结果。例如,搜索“Rond Roc”时,应在搜索Rond Rock(罗马尼亚)之前匹配美国德克萨斯州的round Rock。我希望我已经说得够清楚了 这是我当前的索引配置(这是C#中的匿名类型,稍后序列化为JSON并传递给ElasticSearch API):使用ElasticSearch搜索全球位置名称的有效方法是什么?,search,location,
elasticsearch,Search,Location,
elasticsearch,我有通过解析到关系数据库提供的位置信息。利用这些信息,我试图建立一个ElasticSearch索引,其中包含人口稠密的地方(城市)名称、行政区划(州、省等)名称、国家名称和国家代码。我的目标是提供类似于谷歌地图的位置搜索: 我不需要很酷的粗体突出显示,但我确实需要搜索以类似的方式返回类似的结果。我尝试过用一个位置字段创建一个映射,该字段由整个位置名称组成(例如,“德克萨斯州圆岩镇),我还尝试过用五个单独的字段组成一个位置的每个部分。我尝试过关键字和前缀查询以及edgengram分析器;我一直未
这可能就是您正在寻找的:
"analysis": {
"tokenizer": {
"name_tokenizer": {
"type": "edgeNGram",
"max_gram": 100,
"min_gram": 2,
"side": "front"
}
},
"analyzer": {
"name_analyzer": {
"tokenizer": "whitespace",
"type": "custom",
"filter": ["lowercase", "multi_words", "name_filter"]
},
},
"filter": {
"multi_words": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 10
},
"name_filter": {
"type": "edgeNGram",
"max_gram": 100,
"min_gram": 2,
"side": "front"
},
}
}
我认为使用
name\u analyzer
将复制您所说的谷歌搜索。您可以稍微调整配置以满足您的需要。karmi on#elasticsearch IRC建议我应该研究elasticsearch中的实验性“suggester”功能。根据我的需要,suggester似乎比前缀查询或EdgeGrams工作得更好。谢谢,我一定会将其与suggester实现进行比较。顺便说一句,side
在最新的ES构建中被弃用。我最终选择了完成建议。我不确定我是否正确使用了它,但使用它进行这种搜索非常容易。好的,是的,suggester
似乎是最合适的解决方案。当elasticsearch中没有添加suggester
时,我提供的一个非常旧。正如您正确指出的,侧
已被弃用EdgeGram
,现在,默认情况下,将一侧作为前部
"analysis": {
"tokenizer": {
"name_tokenizer": {
"type": "edgeNGram",
"max_gram": 100,
"min_gram": 2,
"side": "front"
}
},
"analyzer": {
"name_analyzer": {
"tokenizer": "whitespace",
"type": "custom",
"filter": ["lowercase", "multi_words", "name_filter"]
},
},
"filter": {
"multi_words": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 10
},
"name_filter": {
"type": "edgeNGram",
"max_gram": 100,
"min_gram": 2,
"side": "front"
},
}
}