Лучшие практики для создания поискового приложения? - PullRequest
2 голосов
/ 21 мая 2009

Я скоро начну простой проект поиска и поиска данных. По сути, одна из них «помещает мою огромную электронную таблицу Excel в базу данных, создает для нее веб-интерфейс пользователя и делает ее доступной для поиска».

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

Хотя это дает мне очень сильный, детальный контроль над фильтрацией, которую я могу выполнять, мне интересно, что думают SO о фактическом выполнении поиска. Здесь я буду использовать ASP.NET, MS SQL Server и Linq-To-SQL, так что помните об этих технологиях.

С макушки головы, думаю, я бы сделал что-то вроде:

var results = from s in db.Stuff
              where (s.Prop1.Contains(textFilter) ||
                     s.Prop2.Contains(textFilter) ||
                     s.Prop3.Contains(textFilter)) &&
                     checkbox1.IsChecked ?
                          s.Prop4.ToLower().Equals(combobox1.Text) : true
              select s;

Вот что я знаю:

  • Как группировать и объединять при необходимости
  • Я могу использовать метод Contains () для отдельных свойств для генерации SQL LIKE запросов
  • Я могу фильтровать вещи по свойству, создавая логику поиска, как указано выше.

Вот что я спрашиваю:

  • Есть ли способ поиска по всем свойствам (без вытягивания всех объектов в память - я предполагаю, что это означает создание списка свойств каждого объекта с отражением, их приведение в соответствие, а затем проверка завершена)? Если нет, то это кажется невероятно громоздким, так как мне пришлось бы создавать новую логику для каждого нового свойства, которое я мог бы добавить. Что-то вроде s.Contains (textFilter) в вышеприведенном будет идеальным.
  • Как на самом деле работает запрос SQL LIKE ? Это то, что я хочу сделать?
  • Существует ли стандартный способ реализации правил поиска, таких как строки в кавычках, для полных и логических операторов, таких как И и ИЛИ ? Я был бы удивлен, если бы каждое приложение, которое их реализовывало, делало это с пользовательской логикой синтаксического анализа.
  • Я лаю не на том дереве? Я что-то пропустил?

Ответы [ 3 ]

2 голосов
/ 21 мая 2009

Вы не упомянули об этом в своем списке используемых вами технологий, но не забывайте об использовании Lucene.NET . Это делает поиск очень хорошо и довольно прост в настройке. По сути, вы добавляете документы в индекс, а Lucene эффективно управляет индексом. Таким образом, вы можете выполнять поиск по индексу, а не загружать документы один за другим и просматривать их свойства.

2 голосов
/ 21 мая 2009

Недавно мне пришлось создать похожий поиск для системы комментариев. Я создал несколько методов расширения для комментариев, что позволило мне передать общий фильтрующий объект.

Вот пример кода, который я использовал:

Это только частичный метод, который не имеет возврата, но даст вам представление о том, что я делаю:

public List<oComment> GetComments(oCommentSearch filters)
{

    using (CommentDataContext db = CommentContextFactory.CreateContext())
    {
        var query = from comment in db.COMMENTs.FilterComments(filters)
                    select comment;
    }
}

Как вы можете видеть в комментариях, у меня есть FilterComments. Это метод расширения. Этот метод выглядит следующим образом (это весь класс, который у меня есть):

public static class CommentExtensions
    {
        public static IQueryable<COMMENT> FilterComments(this IQueryable<COMMENT> Comments, oCommentSearch Filters)
        {
            Filters = CheckFilter(Filters);

            IQueryable<COMMENT> tempResult = Comments;

            if(Filters.Classes.Count() > 0)
            {
                tempResult = from t in tempResult
                             where
                                 Filters.Classes.Contains(t.CLASS_ID)
                             select t;
            }

            if (Filters.Flags.Count() > 0)
            {
                tempResult = from t in tempResult
                             where
                                 Filters.Flags.Contains((int) t.FLAG_ID)
                             select t;
            }

            if (Filters.Types.Count() > 0)
            {
                tempResult = from t in tempResult
                             where
                                 Filters.Types.Contains(t.CommentTypeId)
                             select t;
            }
            return tempResult;
        }

        private static oCommentSearch CheckFilter(oCommentSearch Filters)
        {
            Filters.Classes  = CheckIntArray(Filters.Classes);
            Filters.Flags =  CheckIntArray(Filters.Flags) ;
            Filters.Types =  CheckIntArray(Filters.Types) ;
            return Filters;
        }

        private static int[] CheckIntArray(int[] ArrayToCheck)
        {
            return ArrayToCheck == null || ArrayToCheck.Count() == 0 ? new int[] {} : ArrayToCheck;
        }
    }

Это должно привести вас в правильном направлении к тому, что вы пытаетесь сделать.

Надеюсь, это поможет!

1 голос
/ 21 мая 2009

Есть ли способ поиска по всем свойствам (без вытягивания всех объектов в память - я предполагаю, что это означает создание списка свойств каждого объекта с отражением, их упорядочивание, а затем проверка завершена)? Если нет, то это кажется невероятно громоздким, так как мне пришлось бы создавать новую логику для каждого нового свойства, которое я мог бы добавить. Нечто подобное s.Contains (textFilter) в вышеприведенном было бы идеальным.

Для этого мы используем функцию полнотекстового поиска MsSql.

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