Elasticsearch在邮政地址和客户号码上进行部分匹配



我正在尝试将搜索项与给定的模式部分匹配以自动完成。我希望customerNumber、AddressLine1和Zip与任何以419开头的文档匹配(因此4191应与客户编号41915678和地址4191 Board Street和邮政编码41912匹配(

"mappings": {
"companyName": {
"type": "text"
},
"customerNumber": {
"type": "long"
}
"address": {
"addressLine1": {
"type": "text"
},
"city": {
"type": "text"
},
"state": {
"type": "text"
},
"zip": {
"type": "text"
}
}
}

有人对这个问题有一个巧妙的解决方案吗?最终,我需要使用NEST客户端将此查询转换为C#。

一种简单的方法是利用completionsuggester字段类型。

基本上,您可以通过在映射中添加completion字段来修改映射,例如

"suggest": {
"type": "completion"
},

然而,完成字段的默认分析器(即simple分析器(没有索引数字,我们需要创建我们的自定义分析器来正确地执行此操作:

PUT my-index
{
"settings": {
"analysis": {
"analyzer": {
"suggest_analyzer": {         <--- custom analyzer
"type": "custom",
"tokenizer": "classic",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"properties": {
...,
"suggest": {                    <--- the new completion field with the right analyzer
"type": "completion",
"analyzer": "suggest_analyzer"
}
}
}
}

然后,你只需要在建议字段中添加所有你想要的建议值来填充你的索引,如下所示:

PUT my-index/_doc/1
{
"address": {
"addressLine1": "1234 Main Street",
"zip": "34526"
},
"customerNumber": "41915678",
"suggest": [
"1234 Main Street",
"34526",
"41915678"
]
}
PUT my-index/_doc/2
{
"address": {
"addressLine1": "4191 Board Street",
"zip": "45263"
},
"customerNumber": "45267742",
"suggest": [
"4191 Board Street",
"45263",
"45267742"
]
}
PUT my-index/_doc/3
{
"address": {
"addressLine1": "5662 4th Avenue",
"zip": "41912"
},
"customerNumber": "24442561",
"suggest": [
"5662 4th Avenue",
"41912",
"24442561"
]
}

然后,您可以使用以下建议查询搜索419

POST my-index/_search
{
"suggest": {
"customer-suggest": {
"prefix": "419",
"completion": {
"field": "suggest"
}
}
}
}

您将获得所有三个文档,因为每个文档都有一个与419匹配的字段

最新更新