如何处理包含带空格或名字的姓氏的文本输入[空格]姓氏组合

时间:2015-05-28 22:29:18

标签: c# search asp.net-web-api

我正在解决一个我无法解决的问题,可以利用你的帮助和专业知识。

我有一个文本框,允许用户通过下面列出的名称标准组合搜索其他用户:

  • < 名字>< 空间>< 姓氏> (约翰史密斯)
  • &lt; 姓氏&gt;&lt; 逗号&gt;&lt; 空间| nospace &gt;&lt; 名字< /强>&GT; (史密斯,约翰)或(史密斯,约翰)
  • 首字母或姓氏的起始部分(在这种情况下,我对名字和姓氏列进行搜索)(史密斯),(约翰),(Sm)或(乔)

问题: 很多用户的姓氏都有空格,如果有人搜索,他们只能输入“ de la ”。

现在在这种情况下,由于单词之间有空格,系统会假设搜索条件的名字以“ de ”开头,姓氏为“ la < /强>”。 如果用户键入“ de la,”,系统将按预期工作,因为现在输入包含逗号,系统将确定此搜索是否为姓,但我必须假设不是每个人都会在最后输入一个逗号。

但是,用户可能只想搜索姓氏以“ de la ”开头的人。

当前选项 我有几个选择,可以帮助你决定推荐哪一个。请尽快添加您的建议。

  • 用户培训。我们总是可以创建帮助指南/培训材料,以便建议用户在搜索包含空格的姓氏时最后输入逗号。我不喜欢这种方法,因为用户体验不再智能/直观,大多数用户都不会阅读帮助指南。
  • 创建2个不同的文本框(名字和姓氏)。我也不是这种方法的粉丝;用户界面看起来和感觉都不一样,对于只想从Outlook或其他地方复制/粘贴名称的用户来说不方便(不必单独复制/粘贴名字/姓氏)。

  • 首先运行搜索条件,然后再搜索具有间隔姓氏的人,并将结果附加到返回值。这可能会起作用,但它会产生很多误报并导致服务器上的额外负载。例如。搜索“ de la ”将返回 Lance,Devon (...)和“ De La Cruz,John ”(...)

我很感激您可以就此问题提出任何类型的反馈;您的经验,最佳实践或最佳实践,您使用过的与此方案相关的一些代码片段。

应用程序背景:用C#编写的ASP.NET(4.0)WebAPI服务;它由坐在不同服务器上的客户消费。

2 个答案:

答案 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,您需要与JohnSmith集合相交以找出两个集合中的用户ID,依此类推。

我不知道您目前使用的是哪种数据库技术,但SQL和NoSQL产品都可以很好地存储,但NoSQL可以更好地工作。