gpt4 book ai didi

search - 使用 ElasticSearch 搜索全局位置名称的有效方法是什么?

转载 作者:行者123 更新时间:2023-11-29 02:57:19 25 4
gpt4 key购买 nike

我有 GeoNames.org 提供的位置信息解析成关系数据库。使用此信息,我试图构建一个 ElasticSearch 索引,其中包含人口稠密的地点(城市)名称、行政区划(州、省等)名称、国家/地区名称和国家/地区代码。我的目标是提供类似于 Google map 的位置搜索:

Google Maps

我不需要很酷的粗体突出显示,但我确实需要搜索以类似的方式返回类似的结果。我已经尝试创建一个映射,其中包含一个包含整个位置名称的位置字段(例如,“Round Rock, TX, United States”),并且我还尝试过让五个单独的字段包含一个位置的每个部分。我已经尝试过关键字和前缀查询以及 edgengram 分析器;我未能找到正确的配置来使其正常工作。

我应该关注哪种分析器(包括索引和搜索)来实现我的目标?此搜索不必像 Google 的那样完美,但我希望它至少相似。

我确实想支持部分名称匹配,这就是我一直在摆弄 edgengram 的原因。例如,搜索“round r”应该匹配美国德克萨斯州朗德罗克市。此外,我更希望那些填充地点(城市)名称以确切搜索词开头的结果排名高于其他结果。例如,搜索“round ro”应该匹配 Round Rock, TX, United States,然后再匹配 Round, Some Province, RO (Romania)。我希望我已经说得够清楚了。

这是我当前的索引配置(这是 C# 中的匿名类型,稍后序列化为 JSON 并传递给 ElasticSearch API):

settings = new
{
index = new
{
number_of_shards = 1,
number_of_replicas = 0,
refresh_interval = -1,
analysis = new
{
analyzer = new
{
edgengram_index_analyzer = new
{
type = "custom",
tokenizer = "index_tokenizer",
filter = new[] { "lowercase", "asciifolding" },
char_filter = new[] { "no_commas_char_filter" },
stopwords = new object[0]
},
search_analyzer = new
{
type = "custom",
tokenizer = "standard",
filter = new[] { "lowercase", "asciifolding" },
char_filter = new[] { "no_commas_char_filter" },
stopwords = new object[0]
}
},
tokenizer = new
{
index_tokenizer = new
{
type = "edgeNGram",
min_gram = 1,
max_gram = 100
}
},
char_filter = new
{
no_commas_char_filter = new
{
type = "mapping",
mappings = new[] { ",=>" }
}
}
}
}
},
mappings = new
{
location = new
{
_all = new { enabled = false },
properties = new
{
populatedPlace = new { index_analyzer = "edgengram_index_analyzer", type = "string" },
administrativeDivision = new { index_analyzer = "edgengram_index_analyzer", type = "string" },
administrativeDivisionAbbreviation = new { index_analyzer = "edgengram_index_analyzer", type = "string" },
country = new { index_analyzer = "edgengram_index_analyzer", type = "string" },
countryCode = new { index_analyzer = "edgengram_index_analyzer", type = "string" },
population = new { type = "long" }
}
}
}

最佳答案

这可能是您正在寻找的:

  "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_analyzer 将复制您正在谈论的谷歌搜索。您可以稍微调整配置以满足您的需要。

关于search - 使用 ElasticSearch 搜索全局位置名称的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20124356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com