我有一个SQLite3
文件,其中包含学生全名“,表示它将超过1个字,至少4个”和学生标记“研究所”。
在用户界面中我UITextField
工作为“search bar
”和UITableView
当用户开始更改textField的值时在异步任务中我根据学生从数据库执行fitch查询全名并在数据可用时更新表,因此每次用户更改textField的值时,表都将达到数据。
这就出现了问题,搜索/查询有很多种情况:
1-用户输入单个字词//他找学生有这个名字或者它可能是姓氏。在这种情况下,查询将是:
SELECT grade,name FROM students where name LIKE 'Adam%' OR name LIKE '% Adam' Limit 20 OFFSET 20
2-用户输入双字.//他以他/她的名字和姓氏寻找学生或者输入名字和第二个名字。在这种情况下,查询将是:
SELECT grade,name FROM students where name LIKE 'Ahmad Rami%' OR name LIKE 'Ahmad % Rami%' Limit 20 OFFSET 20
3-用户继续输入文本,在这种情况下输入全名没问题。
问题是在第一种情况下,如果用户开始输入姓氏“单个单词”,第一个查询将执行但是在他写出姓氏的完整单词之前不会出现任何结果,因为“%”之后没有“%” Adam“但是如果我们在其后面加上”%“,那么在用户意味着第一个nam的情况下,这将返回错误的结果。
EX:
“Adam Jon Mike Smith”
“Jon Adam Maikel Anglo”
“Jims Alin Rafiel Gorden”
如果用户输入“A”==结果==>亚当.....史密斯& jon ada .... Anglo //然后出现,因为“Adam”的名字和“Jon”的姓氏以“A”开头。 但就我而言,只有亚当出现。 如果我们通过在末尾添加“%”来更改查询,并且用户输入“A”===> “ Jims ”将出现在结果中,我不希望它出现
答案 0 :(得分:1)
如果您希望查询知道用户的意图,您将很难过。您可以获得的最佳结果是产生中途直观的结果。因此,如果是用户输入的字符串,您可以搜索'%'或' %%',遵守规则,即输入的字符串必须是名称字符串中至少一个字的开头。如果没有额外的符号,您就无法将此意图与仅搜索名字的愿望区分开来。
根据您的问题,我推导出名称字符串中的不同单词具有不同的含义。有时候一个词被认为是名字的一部分(亚当都在" Jon Adam"" Adam Jon")有时候不是(Alin in" Jims Alin")。 在没有提供庞大知识库的情况下,您无法在程序中区分这些不同的含义。
这个问题的解决方法是告诉你的数据库这个词的含义。例如。名字,中间名,姓氏。然后你可以专门搜索名字或姓氏,不管中间名。
当然,您的用户必须知道名称的哪些部分必须被视为名字,中间名或姓氏。从计算机的角度来看,kjghlgkh'将是一个完美的名字。但我非常怀疑这个名字"确实在这个世界的某个地方被用作名字。计算机只是做他们被告知要做的事情,他们不了解他们做了什么。 (好吧,一些人工智能项目给出了惊人的结果,但这需要一种程序和知识库,这在这里是不合理的。)
由于我想添加更多评论,我删除了评论并将其作为答案发布。