2011-12-24 68 views
4

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

一方面它看起来非常简单:按空间拆分查询并搜索所有相关的表格以查找出现。到现在为止还挺好。 然而

  1. 有哪个城市的名字都超过2个字和用户可以输入他们不同,因为它是免费的文本。
  2. 有迹象表明,超过2个字

问:

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

是我迄今所做的是:

  1. 填充用户数据源的所有用户
  2. 检查查询
  3. 如果国家从国家tableexist存在,那么过滤数据源,让用户从该国家只有
  4. 检查是否存在于查询中的城市表
  5. 如果存在,则过滤数据源以仅让来自该城市的用户

等为每个表,每次当我们发现我们从查询中删除找到的部分表 - 比赛,留给我们的最自由参数:名称

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

我不知道我是否在正确的方向与我所做的一切。只是一个开始点...

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

感谢

回答

0

这些类型的查询是不利于relational databases。如果不是必须的,你可能会想到使用Lucene.Net(c#)Lucene(java)

0

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

我觉得做这种类型的处理的一部分被接受,你赢了” t总是对的。从中可以看出,你的目标是试图找出你对某些假设有信心的案例。

例如,

如果用户在纽约市寻找李四,他们不会键入它为jane new york city doe,名称,城市将永远是连续的群体。你不知道每个组的长度,但是,你只有有限的组合尝试。给定jane doe new york city,你可以迭代连续组的组合。

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

...等等... 并做scoreAsCity相同。

这两个应该有一些清晰的高分得分组合。也许,最好的选择是产生最高总和的名称和城市分数的组合。你需要制定一个评分算法,可能很大程度上基于数据库匹配,但也可能使用辅助输入,如提高本地名称匹配的分数。

非常有趣的话题。