#elasticsearch
Вопрос:
У меня есть адрес с компонентом адреса, хранящимся в моем elasticSearch, каждый адрес выглядит следующим образом в моих ЭС :
{
"_index": "properties",
"_type": "_doc",
"_id": "property_5235354",
"_score": 32.839436,
"_source": {
"id": 5235354,
"branchid": 1,
"suburb": "Lyons",
"postcode": "2606",
"state": "ACT",
"@timestamp": "2021-09-27T08:56:08.827Z",
"agencycode": "X",
"address": "54-5 Burnie St Lyons ACT 2606 AUS",
"streetnumber": "5",
"branchcode": "X_ACT",
"unitnumber": "54",
"agencyid": 1,
"streetname": "Burnie St",
"@version": "1"
}
}
Для поиска конкретного адреса на основе компонентов я рассматриваю следующие моменты :
- Там может быть аббревиатура названий улиц, таких как «Джеймс-стрит» — > «Джеймс-стрит».
- Сопоставление по компонентам адреса с точным совпадением без учета регистра
- Пожалуйста, дайте мне знать, если вы считаете, что мне следует подумать о чем-то другом
Чтобы сделать это, я попытался следовать :
{
"query": {
"bool": {
"should": [
{
"match": {
"streetname.keyword": "Burnie Street"
}
},
{
"match": {
"streetname.keyword": "Burnie St"
}
}
],
"must": [
{
"match": {
"unitnumber.keyword": "54"
}
},
{
"match": {
"streetnumber.keyword": "5"
}
},
{
"match": {
"suburb.keyword": "Lyons"
}
},
{
"match": {
"state": "ACT"
}
},
{
"match": {
"postcode.keyword": "2606"
}
}
]
}
},
"size": 1000
}
Нужна ваша помощь в решении этих :
- Приведенный выше запрос также возвращает неверный результат, например адрес :
54-5 Burnie Avenue Lyons ACT 2606 AUS
который является Берни-авеню, а не Берни-стрит. - Если я дам
burnie street
вместоBurnie Street
этого , он не сможет найти данные.
Дополнительная информация : Это полный результат _search API с указанным выше телом запроса, где адреса 54-5 Burnie St Lyons ACT 2606 AUS
и 54/5 Burnie Street Lyons ACT 2606
совпадают правильно, но 54-5 Burnie Avenue Lyons ACT 2606 AUS
являются недопустимым совпадением
{
"took": 1476,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 32.839436,
"hits": [
{
"_index": "properties",
"_type": "_doc",
"_id": "property_5235354",
"_score": 32.839436,
"_source": {
"id": 5235354,
"branchid": 1,
"suburb": "Lyons",
"postcode": "2606",
"state": "ACT",
"@timestamp": "2021-09-27T08:56:08.827Z",
"agencycode": "X",
"address": "54-5 Burnie St Lyons ACT 2606 AUS",
"streetnumber": "5",
"branchcode": "X_ACT",
"unitnumber": "54",
"agencyid": 1,
"streetname": "Burnie St",
"@version": "1"
}
},
{
"_index": "properties",
"_type": "_doc",
"_id": "property_11081",
"_score": 28.954222,
"_source": {
"id": 11081,
"branchid": 1,
"suburb": "Lyons",
"postcode": "2606",
"state": "ACT",
"@timestamp": "2021-09-27T08:56:08.163Z",
"agencycode": "X",
"address": "54/5 Burnie Street Lyons ACT 2606",
"streetnumber": "5",
"branchcode": "X_ACT",
"unitnumber": "54",
"agencyid": 1,
"streetname": "Burnie Street",
"@version": "1"
}
},
{
"_index": "properties",
"_type": "_doc",
"_id": "property_5235356",
"_score": 22.677355,
"_source": {
"id": 5235356,
"branchid": 1,
"suburb": "Lyons",
"postcode": "2606",
"state": "ACT",
"@timestamp": "2021-09-27T08:56:08.847Z",
"agencycode": "X",
"address": "54-5 Burnie Avenue Lyons ACT 2606 AUS",
"streetnumber": "5",
"branchcode": "X_ACT",
"unitnumber": "54",
"agencyid": 1,
"streetname": "Burnie Avenue",
"@version": "1"
}
}
]
}
}
Комментарии:
1. если это поможет, тот же запрос в SQL будет следующим : выберите * из свойств p, где номер улицы = » 5 «и номер единицы =» 54 «и (название улицы = «Берни-стрит» или название улицы = «Берни-стрит») и пригород = «Лион» и почтовый индекс = «2606» и штат = «ЗАКОН»
2. просто быстро обратите внимание, что это Elasticsearch, а не elasticSearch 🙂
Ответ №1:
Вам необходимо использовать комбинацию bool/must/should
предложения запроса, запроса термина (для точного соответствия, игнорирующего регистр) и запроса match_phrase_prefix
{
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"@version": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"address": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"agencycode": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"agencyid": {
"type": "long"
},
"branchcode": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"branchid": {
"type": "long"
},
"id": {
"type": "long"
},
"postcode": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"state": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"streetname": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"streetnumber": {
"type": "integer"
},
"suburb": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"unitnumber": {
"type": "integer"
}
}
}
}
Поисковый запрос:
{
"query": {
"bool": {
"must": [
{
"term": {
"streetnumber": "5"
}
},
{
"term": {
"unitnumber": "54"
}
},
{
"bool": {
"should": [
{
"term": {
"streetname.keyword": {
"value": "Burnie Street",
"case_insensitive": "true"
}
}
},
{
"match_phrase_prefix": {
"streetname": "Burnie St"
}
}
]
}
},
{
"term": {
"suburb.keyword": {
"value": "Lyons",
"case_insensitive": "true"
}
}
},
{
"term": {
"postcode.keyword": "2606"
}
},
{
"term": {
"state.keyword": {
"value": "ACT",
"case_insensitive": "true"
}
}
}
]
}
}
}
Комментарии:
1. @Prakhar Verma, пожалуйста, просмотрите ответ и дайте мне знать, решит ли это вашу проблему ?
2. работая как заклинание, проверю на нем больше. Ты настоящий ниндзя ЭС. ТИСМ
3. @PrakharVerma рад, что смог вам помочь, и спасибо за ваши добрые слова 😉