【问题标题】:Best Practices for Building a Search App? [closed]构建搜索应用程序的最佳实践? [关闭]
【发布时间】:2009-05-21 13:51:01
【问题描述】:

我将很快开始一个简单的数据存储和搜索项目。基本上,其中之一是“将我巨大的 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


    【解决方案1】:

    我最近不得不为 cmets 系统创建一个类似的搜索。我所做的是从 cmets 创建了一些扩展方法,这些方法允许我传入通用过滤对象。

    这是我使用的示例代码:

    这只是一个部分方法,没有返回,但它会给你一个我在做什么的图片:

    public List<oComment> GetComments(oCommentSearch filters)
    {
    
        using (CommentDataContext db = CommentContextFactory.CreateContext())
        {
            var query = from comment in db.COMMENTs.FilterComments(filters)
                        select comment;
        }
    }
    

    你可以看到评论我有过滤评论。这是一种扩展方法。这个方法看起来像这样(这是我拥有的整个类):

    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 有效地管理索引。这样,您就可以搜索索引,而不是一个一个地加载文档并查看它们的属性。

      【讨论】:

      • 您可以在 .net 中为它构建一个前端,使用 url 请求并处理返回的 xml 文档。我在几分钟内就完成了,我是初学者。我用过 Nutch。
      【解决方案3】:

      有没有办法搜索所有属性(无需将所有对象拉入内存 - 我认为这意味着通过反射构建每个对象属性的列表,将它们字符串化,然后检查出来)?如果没有,这似乎非常麻烦,因为我必须为我可能添加的每个新属性构建新逻辑。像上面的 s.Contains(textFilter) 这样的东西是理想的。

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

      【讨论】:

      • 你能详细说明使用它的含义吗?
      猜你喜欢
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 2017-07-09
      • 2015-07-02
      • 1970-01-01
      • 2020-11-14
      相关资源
      最近更新 更多