我一直在浏览一些社交网络,发现那里可以按姓名、年龄范围、城市、国家和性别搜索人物。 有趣的是,所有这些信息都可以插入到一个由空格分隔的文本框中。然后搜索引擎会以非常准确的方式解析它并返回结果列表。
一方面,它看起来很简单:按空格拆分查询并搜索所有相关表以查找出现情况。到目前为止,一切都很好。 然而
- 有些城市的名称超过 2 个单词,用户可以以不同方式输入它们,因为它是自由文本。
- 有超过2个字的名字
问题:
我们怎样才能以这样的方式拆分查询,我们当然知道哪个 它的一部分应该在哪里搜索?即用户表中的名称,城市 在城市表中,国家中的国家等?
到目前为止我所做的是:
- 用所有用户填充用户数据源
- 检查查询中是否存在 Countries 表中的 Country
- 如果存在则过滤数据源以仅包含来自该国家/地区的用户
- 检查 Cities 表是否存在于查询中
- 如果存在则过滤数据源以仅包含来自该城市的用户
对于每个表依此类推,而每次我们在表中找到匹配项时,我们都会从查询中删除找到的部分,留给我们最自由的参数:名称。
如果用户确切知道城市/国家等在我的数据库中是如何写的,这似乎可行,
但实际情况是,用户可能会输入城市的一部分或输入错误的城市。
我不知道我所做的是否完全正确。只是一个起点……
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/