c# - 一键智能搜索

标签 c# php sql

我一直在浏览一些社交网络,发现那里可以按姓名、年龄范围、城市、国家和性别搜索人物。 有趣的是,所有这些信息都可以插入到一个由空格分隔的文本框中。然后搜索引擎会以非常准确的方式解析它并返回结果列表。

一方面,它看起来很简单:按空格拆分查询并搜索所有相关表以查找出现情况。到目前为止,一切都很好。 然而

  1. 有些城市的名称超过 2 个单词,用户可以以不同方式输入它们,因为它是自由文本。
  2. 有超过2个字的名字

问题:

我们怎样才能以这样的方式拆分查询,我们当然知道哪个 它的一部分应该在哪里搜索?即用户表中的名称,城市 在城市表中,国家中的国家等?

到目前为止我所做的是:

  1. 用所有用户填充用户数据源
  2. 检查查询中是否存在 Countries 表中的 Country
  3. 如果存在则过滤数据源以仅包含来自该国家/地区的用户
  4. 检查 Cities 表是否存在于查询中
  5. 如果存在则过滤数据源以仅包含来自该城市的用户

对于每个表依此类推,而每次我们在表中找到匹配项时,我们都会从查询中删除找到的部分,留给我们最自由的参数:名称

如果用户确切知道城市/国家等在我的数据库中是如何写的,这似乎可行, 但实际情况是,用户可能会输入城市的一部分或输入错误的城市。

我不知道我所做的是否完全正确。只是一个起点……

PS:我只需要一个算法流程,所以编程语言真的不米。任何想法或指导都非常受欢迎。

谢谢

最佳答案

我在这里零经验,但我猜这是natural language processing

我认为进行此类处理的一部分是接受您不会总是做对的事实。由此可见,您的目标是尝试确定您有信心做出某些假设的案例。

例如,

如果用户在纽约市搜索jane doe,他们不会输入jane new york city doe,名称和城市将始终是连续的组。您不知道每组的长度,但是,您只有有限数量的组合可以尝试。给定 jane doe new york city,您可以迭代连续组的组合。

scoreAsName('jane')
scoreAsName('jane doe')
scoreAsName('jane doe new')

……等等…… 对 scoreAsCity 做同样的事情。

两者都应该有一些明确的高分获胜组合。也许,最好的选择是产生最高总和的名称和城市分数的组合。您需要制定一个评分算法,可能主要基于数据库匹配,但它也可以使用辅助输入,例如提高本地名称匹配的分数。

非常有趣的主题。

关于c# - 一键智能搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8626838/

相关文章:

php - 如何计算属于另一列中不同值的列中的所有相同值

sql - oracle - 为每两种类型获取最高值

mysql - MySQL 快照与 SQL 转储的优缺点

c# - 实现行级安全性——(SP 与 LINQ to Objects)

c# - 将用例封装在软件中

php - 使用值形式下拉菜单?

SQL Server 单一查询问题

c# - 可以设置 monthCalendar 以显示当前月份和前 2 个月吗?

c# - 爬行安全站点

php - 分页在 codeigniter 中不起作用