gpt4 book ai didi

c# - 使用超过 2 个单词的单个搜索字符串对名字和姓氏列执行搜索

转载 作者:行者123 更新时间:2023-11-30 17:36:06 25 4
gpt4 key购买 nike

我有一个查询,当前采用单个用户提供的搜索字符串,并尝试搜索一个表,该表包含 firstName 和 lastName 的单独列。如果搜索字符串中有空格,它运行的查询基本上是这样的:

SELECT * FROM table
WHERE table.firstName LIKE @firstName + '%'
AND table.lastName LIKE @lastName + '%'

我们不需要担心搜索字符串中没有空格的情况。

一般情况非常简单——将搜索字符串拆分为一个空格,第一部分是名字,第二部分是姓氏。所以,“Bob Smith”变成了

@firstName = "Bob", @lastName = "Smith"

我挂断的是如何处理名称超过两个单词的情况。像这样的情况

table.firstName        table.lastName
--------------- --------------
Bob van Smith
Billy Bob Smith
Bob van der Smith
Billy Bob van der Smith

等等。现在我们在第一个空格处拆分,所以第一个示例“Bob van Smith”将起作用,因为它分成

@firstName: "Bob", @lastName: "van Smith" 

但是,这并没有捕捉到第二个案例“Billy Bob Smith”,因为它 split 成

@firstName: "Billy", @lastName: "Bob Smith"

当前设置也适用于第三个测试用例,因为它分为

@firstName: "Bob", @lastName: "van der Smith"

如果有办法让它发挥作用,最后一种情况将是加分。

我的第一个想法是将查询修改为

SELECT * FROM table
WHERE table.firstName + ' ' + table.lastName LIKE '%' + @searchString + '%'

但这被否决了,因为我们不希望有人只搜索字母“a”返回大量记录,而双通配符会创建这些记录。

进行这种字符串拆分/搜索有什么技巧吗?这不是第一次出现这个问题,但在互联网上搜索时,除了“split on space”,我什么都找不到,但请注意,如果名称中有 3 个或更多单词,它将无法正常工作”

我感觉像是将“名字之间”作为@firstName 和@lastName 的一部分并做一些巧妙的事情,或者使 SQL 部分更通用,然后在我的 C# 代码中使用 LINQ 进行额外过滤,但我找不到解决方案。

最佳答案

我是通过以下方式完成的:

  1. 使用通配符将每个以空格分隔的名称作为两列的书尾(我无法控制名称顺序或需要名字和姓氏)。
  2. 然后我根据每个匹配项分配一个分数(即它是否是整个单词匹配项以及名字和姓氏列中是否存在匹配项)
  3. 我还设置了最低搜索字母数(最少 2 个字母)

这对我来说效果很好。您仍然可以为小词生成大量匹配项。匹配排名会将差的部分匹配推到列表底部。

关于c# - 使用超过 2 个单词的单个搜索字符串对名字和姓氏列执行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40182365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com