Комплексная функция поиска Entity Framework - PullRequest
1 голос
/ 13 января 2020

Я использую Entity Framework с SQL Express database, и теперь мне нужно сделать функцию поиска для поиска пользователей по значению, введенному в текстовом поле, где конечный пользователь может просто ввести все, что он хочет (например, Google )

Какой лучший способ создать функцию поиска для этого. Входные данные должны искать все столбцы.

Так, например, у меня есть 4 столбца. firstname, lastname, address, emailaddress.

Когда кто-то вводит в поле поиска foo, необходимо искать во всех столбцах все, что содержит foo.

Так что я подумал, что я мог бы сделать что-то вроде

context.Users.Where(u => 
  u.Firstname.Contains('foo') || 
  u.Lastname.Contains('foo') || 
  u.Address.Contains('foo') || 
  u.EmailAddress.Contains('foo')
);

Но ... Конечный пользователь может также ввести foo bar. И тогда пространство в поисковом значении становится требованием and. Поэтому все столбцы следует искать, например, firstname может быть foo, а lastname может быть bar.

Я думаю, что это сложно для запроса Linq? Возможно, мне следует создать поисковый индекс и объединить все столбцы в поисковый индекс, например:

[userId] [indexedValue], где indexedValue - это [firstname + " "+ lastname + " "+ address +" " + emailaddress].

Затем сначала разбейте значение поиска на основе на пробелах, а затем искать столбцы, которые имеют все слова в поисковом значении. Это хороший подход?

1 Ответ

1 голос
/ 14 января 2020

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

Если это минимальное жизнеспособное решение, и вы хотите использовать условия "и" на основе пробелов:

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. Пройдите поиск, если возвращенные результаты не вернули то, что ожидал пользователь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...