Плохая производительность при нечетком живом поиске - PullRequest
0 голосов
/ 23 мая 2019

Я создал веб-API с использованием .NET Core, и в настоящее время я борюсь с конечной точкой, которая возвращает в качестве входных данных верхний список аналогичных адресов клиентов, связанных с адресами клиентов.

Вкратце: у меня есть конечная точка с именем v1 / customer / lookup со следующим объектом body:

{ customerName: "Facebook Ireland Ltd.", street: "4 Grand Canal Square", city: "Dublin"} 

В этом просмотре в реальном времени используется Entity Framework дляполучить доступ к базе данных Azure и ссылаться на таблицу с 700k записей.Данные, которые я запрашиваю: имя клиента, улица, город и улица.Те же данные находятся в таблице базы данных MS SQL.Я использую внешнюю библиотеку (https://nugetmusthaves.com/Package/DuoVia.FuzzyStrings), чтобы проверить, присутствует ли указанное имя клиента (например, «Facebook») в моей базе данных, и процент совпадений, который можно найти.

Например,:

Input customer name: "Facebook" -> in database "Facebook" -> 1.00 (100%)

Input customer name: "Fazebok"  -> not in database        -> 0.75 (75%)

Поиск прямого совпадения (100%) довольно быстрый и занимает 200-300 мс - даже если в списке содержится 700 тыс. Элементов. Когда я не могу найти прямое совпадение, яЯ должен использовать упомянутую библиотеку для проверки каждого элемента в большом списке. Это заставляет ответ API занимать около 15 секунд. Если вы можете искать какой-то код - это не моя главная задача. Мой вопрос - как я могу это сделать?улучшите общий подход, сделав объясненную проверку.

Вот краткий список того, что я пробовал:

  1. Проходя итерации по всем 700 тыс. элементов, я проверяю, является ли имя клиента (в таблице есть дубликаты, которые должны оставаться там), уже проверено нечеткой логикой, что еще больше ухудшило производительность, так как поиск увеличил время отклика.
  2. Уменьшено количествостолбцов, возвращаемых из базы данных -> без улучшения производительности

Что я уже делаю, так это кеширую таблицу базы данных в течение заданного времени, что первый запрос может занять немного больше времени, но следующие запросынамного быстрее.

Возможно, у кого-то из вас есть общее представление о том, как можно реализовать эту живую нечеткую логику.Буду очень рад услышать некоторые идеи!

Заранее спасибо!

...