我的网页上有一个“超级搜索”选项。这只是在多个属性中搜索匹配项。随着时间的推移,它已经从简单的精确文本匹配发展到以任何顺序检查单个单词,并将下划线(如空格)和多个空格(如单个空格)处理,现在它真的是一团糟,不能满足所有情况!
当前 Linq 过滤代码:
private List<StockRecordItem> GetCoreSearchResults()
{
//strip multiple spaces
string searchString = Regex.Replace(uxTxtSuperSearch.Text.Trim(), " +", " ");
List<StockRecordItem> stocks = StoresPortalDataAccessHelper.GetAllStockRecords(uxLocation.SelectedValue)
//Check no super search provided
.Where(s =>
(string.IsNullOrEmpty(searchString)
|| (
// Check Stock description - treating underscores and ampersands as spaces
searchString.ToLower().Split().All(w => s.Description.ToLower().Replace(",", " ").Replace("_", " ").Replace("&", " ").Replace("-", " ").Split().Contains(w))
// Check Stock Notes - treating underscores and ampersands as spaces
|| (s.Notes != null && searchString.ToLower().Split().All(w => s.Notes.ToLower().Replace(",", " ").Replace("_", " ").Replace("&", " ").Replace("-", " ").Split().Contains(w)))
// Check other single word fields
|| s.StockId.Contains(searchString, StringComparison.OrdinalIgnoreCase)
|| s.Description.Contains(searchString, StringComparison.OrdinalIgnoreCase)
|| s.Notes.Contains(searchString, StringComparison.OrdinalIgnoreCase)
|| s.Warehouse.Contains(searchString, StringComparison.OrdinalIgnoreCase)
|| s.IsRestricted.ToString().Contains(searchString.ToLower().Replace("yes", "True").Replace("no", "False"), StringComparison.OrdinalIgnoreCase)
|| (!string.IsNullOrEmpty(s.Manufacturer) && s.Manufacturer.Contains(searchString, StringComparison.OrdinalIgnoreCase))
|| s.RelatedEquipments.Any(e => e.EquipmentNumber.Contains(searchString, StringComparison.OrdinalIgnoreCase))
|| s.RelatedEquipments.Any(e => e.EquipmentId.Contains(searchString, StringComparison.OrdinalIgnoreCase)))
)
// Part Number filter
&& (string.IsNullOrEmpty(uxTxtPartNumber.Text) || s.PartNumber.Contains(uxTxtPartNumber.Text, StringComparison.OrdinalIgnoreCase))
// Warehouse filter
&& (string.IsNullOrEmpty(uxWarehouse.SelectedItem.Text) || s.Warehouse.Contains(uxWarehouse.SelectedItem.Text, StringComparison.OrdinalIgnoreCase))
)
.ToList();
return stocks;
}
所需功能:
- 搜索完全匹配
- 不区分大小写
- 多个空格被视为单个空格
- 下划线和 & 符号被视为单个空格
- 'MySearchString' 将匹配 'MySearchString 记录项' 或 'MySearchString'
- “我的搜索字符串”将匹配“字符串搜索我的”或这些单词的任何其他组合。(注意:这不匹配“字符串搜索”,每个单词都必须存在)
- 还有什么我可能没有提到的搜索解决方案中的好习惯吗?
问题:
- 如何清理上述代码以提高可读性/性能?
- 如何添加通配符选项。即搜索字符串 'My%Item' 返回 'my item' 和 'myItem'