我正在解决一个我无法解决的问题,可以利用你的帮助和专业知识。
我有一个文本框,允许用户通过下面列出的名称标准组合搜索其他用户:
问题: 很多用户的姓氏都有空格,如果有人搜索,他们只能输入“ de la ”。
现在在这种情况下,由于单词之间有空格,系统会假设搜索条件的名字以“ de ”开头,姓氏为“ la < /强>”。 如果用户键入“ de la,”,系统将按预期工作,因为现在输入包含逗号,系统将确定此搜索是否为姓,但我必须假设不是每个人都会在最后输入一个逗号。
但是,用户可能只想搜索姓氏以“ de la ”开头的人。
当前选项 我有几个选择,可以帮助你决定推荐哪一个。请尽快添加您的建议。
创建2个不同的文本框(名字和姓氏)。我也不是这种方法的粉丝;用户界面看起来和感觉都不一样,对于只想从Outlook或其他地方复制/粘贴名称的用户来说不方便(不必单独复制/粘贴名字/姓氏)。
首先运行搜索条件,然后再搜索具有间隔姓氏的人,并将结果附加到返回值。这可能会起作用,但它会产生很多误报并导致服务器上的额外负载。例如。搜索“ de la ”将返回 Lance,Devon (...)和“ De La Cruz,John ”(...)
我很感激您可以就此问题提出任何类型的反馈;您的经验,最佳实践或最佳实践,您使用过的与此方案相关的一些代码片段。
应用程序背景:用C#编写的ASP.NET(4.0)WebAPI服务;它由坐在不同服务器上的客户消费。
答案 0 :(得分:1)
我已经使用这种技术多年了,我喜欢它。
丢失逗号,没有人会使用它。如果没有空格,请先搜索最后一个OR。如果有空格,请搜索第一个和最后一个。此代码适用于部分名称搜索,即“J S”找到Jane Smith和John Smith。 “约翰”会找到“约翰史密斯”和“安妮约翰逊”。这应该为您提供一个非常好的起点,让您可以根据需要获得支持的查询。
public IEnumerable<People> Search(string query, int maxResults = 20)
{
if (string.IsNullOrWhiteSpace(query))
{
return new List<People>();
}
IEnumerable<People> results;
var split = query.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (split.Length > 1)
{
var firstName = split[0];
var lastName = string.Join(" ", split.Skip(1));
results = PeopleRepository.Where(x =>
x.FirstName.StartsWith(firstName, StringComparison.OrdinalIgnoreCase) &&
x.LastName.StartsWith(lastName, StringComparison.OrdinalIgnoreCase));
}
else
{
var search = split[0];
results = PeopleRepository.Where(x =>
x.FirstName.StartsWith(search, StringComparison.OrdinalIgnoreCase) ||
x.LastName.StartsWith(search, StringComparison.OrdinalIgnoreCase));
}
return results.Take(maxResults);
}
答案 1 :(得分:0)
也许重点是您应该索引用户数据以便有效地查找它。
例如,您应该对名字和姓氏编制索引,而不关心它们是名字还是姓氏。您想搜索人员,为什么最终用户应该关心搜索字词顺序?
整个索引可以将用户ID存储在由名称(名字或姓氏)专用的集合上。如果用户ID是整数,那么它将是这样的:
John => 12, 19, 1929, 349, 1, 29
Smith => 12, 349, 11, 4
Matias => 931, 45
Fidemraizer => 931
这样用户输入任何内容并且您不再关心订购:如果用户键入“John”,您将向所有用户显示其ID在John
集中的位置。如果他们同时键入John Smith,您需要与John
和Smith
集合相交以找出两个集合中的用户ID,依此类推。
我不知道您目前使用的是哪种数据库技术,但SQL和NoSQL产品都可以很好地存储,但NoSQL可以更好地工作。