我要完成的工作是使用ElasticSearch来执行类似于给定的返回地址。假设有人输入“ 123 Main St.”但数据中包含“ 123 MAIN STREET SOUTH”,它将作为部分匹配结果返回。
因此,我在ElasticSearch的街道字段上进行了以下设置:
{
"mappings": {
"addresses": {
"properties": {
"street1": {
"type": "string",
"analyzer": "street_analyzer"
}
}
}
},
"settings": {
"index": {
"analysis": {
"analyzer" : {
"street_analyzer" : {
"type": "custom",
"tokenizer": "standard",
"filter": ["standard", "lowercase", "street_filter_synonym", "street_filter_stop", "stop", "street_filter_shingle"]
}
},
"filter": {
"street_filter_synonym": {
"type" : "synonym",
"ignore_case": true,
"synonyms" : []
},
"street_filter_stop" : {
"type" : "stop",
"ignore_case": true,
"stopwords": []
},
"street_filter_shingle": {
"type" : "shingle",
"output_unigrams" : true,
"min_shingle_size" : 2,
"max_shingle_size" : 5
}
}
}
}
}
}
我正在尝试像这样在该字段上进行搜索:
{
"query": {
"match": {
"street1": {
"query": "436 5TH AVE",
"fuzziness": "AUTO",
"operator": "and",
"analyzer":"street_analyzer"
}
}
}
}
我找到了比赛,但如果我对“ 436 5TH AVE SOUTH”进行相同的搜索,则不会。我认为这种重叠将使它与部分匹配,因为它既标记了索引字段又查询了字符串,但这似乎并非如此。
一个人怎么能接受单个输入字符串并匹配带瓦片的版本,而忽略那些不存在的字段呢?