【发布时间】:2012-06-12 10:12:09
【问题描述】:
好吧,伙计们,我在这里遇到了麻烦。
基本上我遇到的问题是,当人们在搜索某些东西时,他们经常会错误输入代码,因为他们经常会涉及多个 0,例如在搜索时:K00000WEFLZ 他们会错误输入 0,然后是产品结果什么也没返回,我基本上是想尝试让它搜索检查搜索是否在字母“K”之后包含一定数量的 0(因为 K 总是有 10+ 个 ID 号和至少 4 个-5 0's),如果是,则在搜索操作期间将其替换为“*”,并且仍然允许您找到产品,无论他们输入的问题有多么错误。
我知道我将不得不创建一个自定义类并为此覆盖默认值(但是其中很多无法访问/是私有的),因为无法更改默认搜索模式,因为这将为每个人更改它我只希望它用于这个特定的网站。
我也不能在开头或结尾使用通配符,因为它有一个庞大的目录,它会将里程与许多结果相匹配。
据我所知,这是处理默认逻辑类搜索的代码:
protected virtual IList<Product> CreateCustomCollection()
{
var list = new List<Product>();
switch (mode)
{
case ProductRepeaterMode.Search:
if (Page.Request.QueryString["search"] != null && Page.Request.QueryString["search"].Length != 0)
{
bool[] customString = new bool[5] { SearchCustomString1, SearchCustomString2, SearchCustomString3, SearchCustomString4, SearchCustomString5 };
IList<Product> results = Fabric.ObjectProvider.Get<IProductSearchCommand>().Search(Page.Request.QueryString["search"], out searchWords, IncludeSkus, IsPublicFacing, customString, CoreHttpModule.Session);
var retailOrder = WebStoreManager.CurrentOrder as IRetailOrder;
var accountOrder = WebStoreManager.CurrentOrder as IAccountOrder;
IList<Product> productsToRemove = new List<Product>();
IList<Product> productsToAdd = new List<Product>();
foreach (var product in results)
{
if (hideRestrictedProducts)
{
if (retailOrder != null)
{
if (!product.CanBePurchasedByRetailCustomer || product.AgentOnly)
productsToRemove.Add(product);
}
else
{
if (accountOrder != null)
{
var add = false;
if (product.CanBePurchasedOnAccount)
add = true;
if (product.AgentOnly)
{
if (accountOrder.Agent != null)
add = true;
else
add = false;
}
if (!add)
productsToRemove.Add(product);
}
}
}
// Replace SKUs with lines
if (resolveSkusToLines)
{
var sku = product.Role as SkuProductRole;
if (sku != null)
{
productsToRemove.Add(product);
if (sku.Owner != null && sku.Owner.Product != null)
{
var line = sku.Owner.Product;
if (!results.Contains(line) && !productsToAdd.Contains(line))
productsToAdd.Add(line);
}
}
}
}
foreach (Product product in productsToAdd)
{
results.Add(product);
}
foreach (Product product in productsToRemove)
{
results.Remove(product);
}
foreach (var result in results)
list.Add(result);
}
break;
}
return list;
}
【问题讨论】:
-
我正在考虑可能将搜索字符串分解为一个字符数组,然后检查数据库中与该字符数组最相似的字符串,但是我觉得这样做效率极低
-
我也可以这样做,所以如果有说... 2+ 0,我将它们全部替换为通配符。
-
我正在研究使用正则表达式来检测和替换它
-
您可能想考虑使用 Levenshtein 距离算法来比较字符串的相似性?您会在此 here 上找到一个 SO 问题。
-
唯一的问题是它必须用于每一个根本没有效率的产品,不过谢谢你的评论。
标签: c#