我有一个应用程序,我正在从用户输入大量“产品名称”并检索有关每个产品的一些信息。问题是,用户可能输入部分名称甚至是错误的名称,因此我想返回最接近的匹配以供进一步选择。
基本上,如果产品名称A与记录完全匹配,则返回该记录,否则返回任何包含匹配项。否则返回null。
我用三个单独的陈述完成了这个,我想知道是否有更有效的方法来做到这一点。我正在使用LINQ to EF,但出于性能原因,我首先将产品实现到列表中。
productNames是产品名称列表(由用户输入)。 产品是产品'记录'列表
var directMatches = (from s in productNames
join p in products on s.ToLower() equals p.name.ToLower() into result
from r in result.DefaultIfEmpty()
select new {Key = s, Product = r});
var containsMatches = (from d in directMatches
from p in products
where d.Product == null
&& p.name.ToLower().Contains(d.Key)
select new { d.Key, Product = p });
var matches = from d in directMatches
join c in containsMatches on d.Key equals c.Key into result
from r in result.DefaultIfEmpty()
select new {d.Key, Product = d.Product ?? (r != null ? r.Product: null) };
答案 0 :(得分:1)
如果您在内存中有一个中小型列表,请查看LiquidMetal和语音匹配,使用Soundex算法对最接近的匹配进行排名。
如果您使用的是SQL Server,请查看Full-Text Search,这是Stack Overflow使用的内容。否则,here是我implemented基于关键字的搜索方式。