И

#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"
                 }
}
 

Для поиска конкретного адреса на основе компонентов я рассматриваю следующие моменты :

  1. Там может быть аббревиатура названий улиц, таких как «Джеймс-стрит» — > «Джеймс-стрит».
  2. Сопоставление по компонентам адреса с точным совпадением без учета регистра
  3. Пожалуйста, дайте мне знать, если вы считаете, что мне следует подумать о чем-то другом

Чтобы сделать это, я попытался следовать :

 {
    "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
}
 

Нужна ваша помощь в решении этих :

  1. Приведенный выше запрос также возвращает неверный результат, например адрес : 54-5 Burnie Avenue Lyons ACT 2606 AUS который является Берни-авеню, а не Берни-стрит.
  2. Если я дам 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 рад, что смог вам помочь, и спасибо за ваши добрые слова 😉