构建搜索应用程序的最佳实践? [关闭]

2023-12-14

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

这是我所知道的:

  • 必要时如何进行分组和加入
  • 我可以使用包含()单个属性上的方法来生成 SQLLIKE queries
  • 我可以按属性过滤事物,如上所述构建我的搜索逻辑。

这就是我要问的:

  • 有没有一种方法可以搜索所有属性(无需将所有对象拉入内存 - 我认为这意味着通过反射构建每个对象属性的列表,将它们字符串化,然后进行检查)?如果没有,这看起来非常麻烦,因为我必须为我可能添加的每个新属性构建新的逻辑。就像是s.Contains(文本过滤器)上面的内容是理想的。
  • 一条SQL是如何实现的LIKE查询实际上有效吗?这是我想做的事吗?
  • 是否有实现搜索规则的标准方法,例如完全匹配的带引号字符串和逻辑运算符,例如AND and OR?如果每个实现它们的应用程序都使用自定义解析逻辑来实现这一点,我会感到惊讶。
  • 我是不是找错了树?我错过了什么?

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

这是我使用的示例代码:

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

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;
        }
    }

这应该可以帮助您朝着正确的方向开始尝试做的事情。

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建搜索应用程序的最佳实践? [关闭] 的相关文章

随机推荐

  • 将绘图映射到 FacetGrid 时的图例问题

    我还在seaborn git repo 中提出了一个问题here 然而 我很可能犯了一些基本错误 而不是错误 但我还没有弄清楚 问题 相同的颜色被分配给图例中的两个不同的值 当我扩展到更多仅包含分配给 色调 的值的子集的图形时 如何防止这种
  • 从检测方法调用自己的类时出现 Java NoClassDefFoundError

    我正在开发一套简单的 Java 代理工具包 以帮助我 也希望其他人 排除 Java 应用程序的故障 我想创建的代理之一是 JComponent getToolTipText 方法 只需将鼠标光标悬停在任何 GUI 类上即可快速识别该类 您可
  • Jackson XML:如何将空/空集合序列化为空节点

    我正在使用 Jackson XML 2 8 9 不幸的是我找不到任何方法将空 空集合序列化为空节点 负责序列化为 XML 的方法 protected byte toXml final Collection
  • 将 Base64 编码的图像上传到 Node.js 服务器不起作用

    我正在使用 MEAN io 并且正在尝试上传 Base64 编码的图像 客户端 AngularJS Image we re going to send it out var base64Image files i var file imag
  • 在应用程序商店中转让 iPhone 应用程序的所有权

    我和我的团队有一个应用程序 我们很快就会将其提交到商店 但我们知道我们将在不久的将来将该应用程序出售给另一家公司 有人有将应用程序的所有权转移到另一个帐户的经验吗 具体来说 当我将应用程序出售给另一家公司时 我们如何将应用程序移至他们的帐户
  • 使用交替和分组结构

    最初我想要一个正则表达式来解析月份数字 首先我想出了以下正则表达式 1 9 1 1 012 它匹配任何正数 表示它匹配该数字的高位数字 即 1 gt 1 2 gt 2 9 gt 9 10 gt 1 19 gt 1 20 gt 2 为什么会这
  • 如何在代码中复制 android:editable="false" ?

    在布局中您可以设置EditText小部件不可通过android editable attribute 我怎样才能在代码中做到这一点 我需要做EditText小部件可根据条件进行编辑 editText setFocusable false e
  • 使用 DomDocument 将实体添加到 DOCTYPE

    我正在尝试创建一个类似于这样的 XML 文档
  • 禁用按钮时更改按钮的样式 ( IsEnabled=False )

    我有一个 UWP 问题 当按钮禁用时 IsEnabled False 如何更改按钮的样式 Microsoft added the VisualStateManager known from Silverlight to the Window
  • FastAPI - 如何在中间件中获取响应正文

    有没有办法在中间件中获取响应内容 以下代码是从here app middleware http async def add process time header request Request call next start time t
  • 引导程序弹出窗口内的日期选择器[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我在弹出框内放置了一个日期选择器 日期选择器不工作 有没有人这样做过 div class col sm 4 div
  • 如何通过正则表达式删除包含特定短语的文本块

    我有一些文本 如下所示 12 12 obj lt lt Some content here gt gt endobj 12 13 obj lt lt Some content here with a email address that c
  • 如何改变VBA中形状文本的样式?

    我用以下代码行更改了文本的大小 shp CellsSRC visSectionCharacter 0 visCharacterSize FormulaU 3pt 我想使用相同的代码模式更改形状文本的样式 粗体 和颜色 我没有找到确切的 公式
  • Visual Studio 2015 TFS .tfignore 文件

    我想忽略 Visual Studio 2015 解决方案中的文件夹 及其内容 签入 tfs 我在项目的根目录中创建了一个名为 tfignore 的文件 其中包含我要排除的文件夹 该文件的内容如下所示 Dist 这根本不起作用 即使我添加 c
  • 主函数内部静态分配大量内存

    我有一个程序必须在 C 中声明一个大小为 1000000 的巨大整数数组 使用 GNU GCC 编译器 我尝试用两种不同的方式声明数组 两个可能的代码是 include
  • 如果要同步读,是否还需要同步写?

    我对同步块没有什么疑问 在提出问题之前 我想分享另一篇相关帖子的答案相关问题答案的链接 我引用彼得 劳瑞来自同一个答案 synchronized ensures you have a consistent view of the data
  • PHP 逐行读取时可以排除换行符吗?

    我想逐行阅读 但我不想处理换行符 我希望将其删除 这样我最终只得到该行的内容 所以现在我的功能是 function getProductCount path count 0 foreach file path as name if name
  • 在哪里可以找到elasticache redis集群的TLS证书

    作为 Elasticache 的新手 我正在尝试从在不同 VPC 中运行的实例连接到它 当客户端位于基于 TLS 的 VPC 内时 它工作得很好 因为不需要传递 TLS 证书 我们只需要向 redis cli 传递 tls 选项 同样 当我
  • NSDate dateFromString 已弃用?

    我正在尝试使用 NSDate dateFromString 方法 但收到警告并且它导致应用程序崩溃 代码如下 NSString pickerDate NSString stringWithFormat timeSelector date N
  • 构建搜索应用程序的最佳实践? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我很快将开始一个简单的数据存储和搜索项目 基本上 其中之一是 将我巨大的 Excel 电子表格放入数据库 为其构建一个 Web GUI 并使其可搜索 类型的东西 困扰我的一件事是当用户输入