Словарь сделает всю работу. Однако, если вы выполняете быстрые частичные совпадения (например, поиск по типу пользователя), вы можете получить более высокую производительность, создав несколько ключей, которые указывают на один и тот же элемент. Например, слово «Apple» может быть расположено через «Ap», «App», «Appl» и «Apple».
Я использовал этот подход на аналогичном количестве записей с очень хорошими результатами. Я превратил свои 10К исходные предметы в около 50К уникальных ключей. Каждая из этих статей Словаря указывает на список, содержащий ссылки на все совпадения для этого термина. Затем вы можете найти этот гораздо меньший список более эффективно. Несмотря на большое количество создаваемых списков, объем памяти достаточно разумный.
При желании вы также можете создавать свои собственные ключи, чтобы перенаправлять общие орфографические ошибки или указывать на связанные элементы. Это также устраняет большинство проблем с уникальными ключами, потому что каждый ключ указывает на список. Один элемент может быть классифицирован по каждому слову в его названии; это очень полезно, если у вас длинные названия продуктов с несколькими словами. При классификации ваших предметов каждое слово в имени может быть сопоставлено с одним или несколькими ключами.
Я также должен отметить, что построение и классификация 10K-элементов не должны занимать много времени, если все сделано правильно (разумно пара сотен миллисекунд). Результаты можно кэшировать столько раз, сколько вы хотите, используя Application
, Cache
или статические элементы.
Подводя итог, можно сказать, что результирующая структура представляет собой Dictionary<string, List<T>>
, где строка короткая (хорошо работает 2-6 символов), но уникальный ключ. Каждый ключ указывает на List<T>
(или другую коллекцию, если вы так склонны) предметов, которые соответствуют этому ключу. Когда поиск выполняется, вы находите ключ, который соответствует термину, предоставленному пользователем. В зависимости от длины ваших ключей, вы можете сократить поиск пользователя до максимальной длины ключа. Найдя правильную дочернюю коллекцию, вы затем ищете в этой коллекции полное или частичное соответствие, используя любую методологию, какую пожелаете.
Наконец, вы можете захотеть создать облегченную структуру для каждого элемента в списке, чтобы вы могли хранить дополнительную информацию об этом элементе. Например, вы можете создать небольшой класс Product, в котором хранится название, цена, отдел и популярность продукта. Это может помочь вам уточнить результаты, которые вы показываете пользователю.
В целом, вы можете выполнять интеллектуальный, подробный, нечеткий поиск в режиме реального времени.
Вышеупомянутые структуры должны обеспечивать функциональность, примерно эквивалентную три .