搜索大量文本列表的最快方法

use*_*862 6 c# regex search text

我有一个用C#编写的Windows应用程序,需要从数据库加载250,000行并提供"键入时搜索"功能,这意味着只要用户在文本框中输入内容,应用程序就需要搜索所有250,000条记录(其中是btw,单列,每行1000个字符)使用like搜索并显示找到的记录.

我遵循的方法是:

1-该应用程序将所有记录加载到一个类型中 List<EmployeeData>

while (objSQLReader.Read())
{
    lstEmployees.Add(new EmployeesData(
        Convert.ToInt32(objSQLReader.GetString(0)),
        objSQLReader.GetString(1), 
        objSQLReader.GetString(2)));
}
Run Code Online (Sandbox Code Playgroud)

2-在TextChanged事件中,使用LINQ,我搜索(与正则表达式的组合)并将其附加IEnumerable<EmployeesData>到处于虚拟模式的ListView.

String strPattern = "(?=.*wood*)(?=.*james*)";
    IEnumerable<EmployeesData> lstFoundItems = from objEmployee in lstEmployees
    where Regex.IsMatch(Employee.SearchStr, strPattern, RegexOptions.IgnoreCase)
    select objEmployee;
    lstFoundEmployees = lstFoundItems;
Run Code Online (Sandbox Code Playgroud)

处理3-4 RetrieveVirtualItem事件以显示ListView中的项目以显示该项目.

e.Item = new ListViewItem(new String[] { 
    lstFoundEmployees.ElementAt(e.ItemIndex).DateProjectTaskClient, 
    e.ItemIndex.ToString() });
Run Code Online (Sandbox Code Playgroud)

虽然lstEmployees从SQL Server加载列表的加载速度相对较快(1.5秒),但要在TextChanged上搜索,使用LINQ搜索需要7分钟以上.通过执行LIKE搜索直接搜索SQL Server 只需不到7秒.

我在这做错了什么?如何更快地进行此搜索(不超过2秒)?这是我的客户的要求.所以,任何帮助都非常感谢.请帮忙...

Tim*_*ora 2

请参阅我对这个问题的回答。如果您需要即时响应(即与用户输入一样快),将数据加载到内存中可能是一个非常有吸引力的选择。它可能会使用一点内存,但速度非常快。

尽管有很多字符(250K 记录 * 1000),但有多少个唯一值?基于键的内存结构以及指向与这些键匹配的记录的指针实际上不必那么大,甚至考虑到这些键的排列。

如果数据确实无法放入内存或经常更改,请将其保留在数据库中并使用 SQL Server 全文索引,这将比LIKE. 这假设从应用程序到数据库的连接是快速的。

全文索引提供了一组强大的运算符/表达式,可用于使搜索更加智能。它随免费的 SQL 表达式版本一起提供,最多可处理 10GB 的数据。