生成搜索应用程序的最佳做法?

问题描述 投票:2回答:3

我将很快开始一个简单的数据存储和搜索项目。 基本上,其中之一就是“将我庞大的Excel电子表格放入数据库,为其构建Web GUI,使其可搜索”。

让我烦恼的一件事是,当用户输入某些条件时将使用的实际搜索逻辑。 我正在想象一个带有文本字段和其他一些过滤工具的搜索界面-下拉组合框和复选框等。

尽管这使我对可以执行的过滤功能进行了非常强大的细粒度控制,但我想知道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查询实际上如何工作? 那是我想做的事吗?
  • 是否有一种标准的方法来实现搜索规则,例如为完全匹配的加引号的字符串以及诸如ANDOR的逻辑运算符? 如果每个实现它们的应用程序都使用自定义解析逻辑来做到这一点,我会感到惊讶。
  • 我在树上叫错了吗? 我错过了什么?
asp.net sql-server linq-to-sql search
3个回答
2
投票

最近,我不得不为评论系统创建类似的搜索。 我所做的是根据注释创建了一些扩展方法,这些方法使我可以传递通用过滤对象。

这是我使用的示例代码:

这只是一个局部方法,没有返回值,但是它将为您提供我在做什么的图片:

public List<oComment> GetComments(oCommentSearch filters)
{

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

如您所见,COMMENTs我有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;
        }
    }

这应该使您开始正确地尝试要做的事情。

希望这可以帮助!


2
投票

您没有在使用的技术列表中提到它,但不要忽略使用Lucene.NET 。 它的搜索效果非常好,并且非常容易设置。 基本上,您将文档添加到索引中,Lucene可以有效地管理索引。 这样,您可以搜索索引,而不是一个个地加载文档并查看其属性。


1
投票

有没有一种搜索所有属性的方法(无需将所有对象都拉到内存中-我认为这意味着用反射构建每个对象的属性列表,对其进行字符串化,然后检查出)? 如果没有,这似乎非常麻烦,因为我必须为可能添加的每个新属性构建新逻辑。 上面的s.Contains(textFilter)之类的东西很理想。

我们正在为此使用MsSql全文搜索功能。

© www.soinside.com 2019 - 2024. All rights reserved.