我在ElasticSearch中构建地址搜索查询时遇到了问题。
地址存储在ES中,结构如下:
地址 {
街,
市,
邮政编码
}
这是一个示例查询:
GET /adr-address/_search
{
"query": {
"multi_match": {
"query": "mainstreet, houston",
"type": "most_fields",
"fields": [ "street", "city", "zipcode"]
}
}
}
"hits": [
{
"_source": {
"id": "S6v4xyO8UE5NRcWtmMATPQ==",
"street": "Houston 2nd Avenue",
"zipcode": "8032",
"city": "Houston"
}
},
{
"_source": {
"id": "aLgQFrO8zCT8m88lAnYZPQ==",
"street": "Houston 1st Avenue",
"zipcode": "8044",
"city": "Houston"
}
},
{
"_source": {
"id": "aLgQFrO8zCT8m88lAnYZPQ==",
"street": "mainstreet",
"zipcode": "8044",
"city": "Houston"
}
},
多重匹配查询在大多数情况下都能正常工作,但街道包含城市名称的情况除外。 Elasticsearch为这些结果分配了更高的优先级,这是完全可以理解的,即使不可接受。
这是_analyze结果:
GET /adr-address/_validate/query?explain
{
"query": {
"multi_match": {
"query": "mainstreet, houston",
"type": "most_fields",
"fields": [ "street", "city", "zipcode" ]
}
}
}
{
"valid": true,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"explanations": [
{
"index": "adr-address",
"valid": true,
"explanation": "(zipcode:mainstreet zipcode:houston) (street:mainstreet street:houston) (city:mainstreet city:houston)"
}
]
}
应该注意的是,谷歌地图api会返回同一查询的准确结果。
到目前为止所做的假设/条件:
有关如何改进搜索重播的任何建议吗?
答案 0 :(得分:0)
尝试使用cross_fields而不是most_fields作为multi_match的类型。
来自文档:
cross_fields类型对结构化文档特别有用 多个字段应匹配的位置。例如,查询时 “Will Smith”的first_name和last_name字段,最佳匹配是 可能在一个领域有“意志”,在另一个领域有“史密斯”。
您使用的大多数字段似乎是用于搜索相同的文本,但以不同的方式进行分析。
示例查询:
GET /adr-address/_search
{
"query": {
"multi_match": {
"query": "mainstreet, houston",
"type": "cross_fields",
"fields": [ "street", "city", "zipcode"]
}
}
}