Первым шагом в любом проекте является управление ожиданием. Найдите минимальное жизнеспособное решение для нужд бизнеса и разработайте его. Расширьте это, поскольку ценность бизнеса доказана. Предоставление действительно гибких и интеллектуальных возможностей поиска, безусловно, сделает бизнес счастливым, но зачастую он не может делать то, что от него ожидают, или работать в соответствии со стандартом, который им нужен, когда более простое решение будет делать то, что ему нужно, проще разрабатывать и выполнять быстрее.
Если это минимальное жизнеспособное решение, и вы хотите использовать условия "и" на основе пробелов:
public IQueryable<User> SearchUser(string criteria)
{
if(string.IsNullOrEmpty(criteria))
return new List<User>().AsQueryable();
var criteriaValues = criteria.Split(' ');
var query = context.Users.AsQueryable();
foreach(var value in criteriaValues)
{
query = query.Where(u =>
|| u.Firstname.Contains(value)
|| u.Lastname.Contains(value)
|| u.Address.Contains(value)
|| u.EmailAddress.Contains(value));
}
return query;
}
Проблема с попыткой индексирования комбинированного Значения в том, что нет гарантии того, что для значения, такого как "foo bar", что "foo" представляет имя, а "bar" представляет фамилию, или что "foo" представляет полное или частичное значение. Вы также хотели бы рассмотреть возможность удаления запятых и других знаков препинания, поскольку кто-то может напечатать «smith, john»
Когда дело доходит до поиска, он может заплатить, чтобы выполнить немного больше сопоставления с шаблоном, чтобы определить, что пользователь может быть ищет. Например, одно слово типа «кузнец» может найти точное совпадение по имени или фамилии и отобразить результаты. Если совпадений не найдено, выполните поиск Contains
. Если он содержит 2 слова, тогда поиск имени и фамилии соответствует предположению «первый последний» против «последний, первый». Если значение имеет символ «@», по умолчанию используется поиск по адресу электронной почты, если он начинается с цифры. , то поиск адреса. Каждая обнаруженная опция поиска может иметь поиск в первом проходе (ожидая более точных значений), а затем предположение о более широком поиске во втором проходе, если оно возвращается пустым. Могут быть даже 3-й и 4-й проходы поиска с более широкими проверками. Когда результаты представлены, может быть предусмотрена кнопка «больше результатов ...» для запуска 2-го, 3-го, 4-го и т. Д. c. Пройдите поиск, если возвращенные результаты не вернули то, что ожидал пользователь.
Идея заключается в поиске: попробуйте выполнить наиболее типичный, узкий ожидаемый поиск и позволить пользователю расширить поиск, если они так хотят. Цель состоит в том, чтобы попытаться «достичь» наиболее релевантных результатов на ранних этапах, помогая определить, как пользователи вводят свои критерии, а затем настроить их на более высокую производительность на основе отзывов пользователей, а не пытаться писать запросы для получения максимально возможного количества попаданий. Цель состоит в том, чтобы помочь пользователям найти то, что они ищут на первой странице результатов. В любом случае, создание полезного поиска увеличит сложность использования новых сторонних библиотек. Сначала определите, действительно ли эта возможность требуется.