我有一个问题,除了它听起来微不足道之外,找到一个直接的,可扩展的和性能解决方案并不简单(对我来说)。我有一个输入文本,网站用户可以搜索位置。
今天,该位置可以是城市,城市中的地址或城市中的邻居,用户必须使用逗号将地址或邻居与城市分开,然后我很容易将字符串拆分为找出第一个街区是地址,社区还是城市。如果用户未能使用所有需要的信息填写输入,放置一个没有城市的地址,并且我匹配的名称不同于一条街道,我们会显示所有位置供他选择正确的地址。
使用搜索日志,我们发现大多数用户都不使用逗号,即使所有工具提示指向如何使用位置搜索(thx google:p)。
因此,需要对位置搜索的新要求,以接受非逗号分隔的地址,例如:
1. "5th Avenue"
2. "Manhattan"
3. "New York"
4. "5th Avenue Manhattan"
5. "5th Avenue Manhattan New York"
6. "Manhattan New York"
7. "5th Avenue New York"
但是我找不到找到每个块的含义的方法或一种动态的方法来使这个工作。也就是说,如果我得到像“New Yok”这样的字符串,“new”可以是一个地址,而“york”可以是一个城市。
我的问题是,是否有某种技术或框架可以实现我的需要,或者我需要在算法中(基于单词,逗号等的数量)按照我的方式工作?
EDIT1:
因为我使用SQL Server,所以我正在考虑全文搜索多列搜索,之前进行完全匹配,之后进行非精确匹配。但我认为一些不完整的地址将返回数千行。
答案 0 :(得分:1)
特异性从左到右减少的关键不是?也就是说,最右边的语义元素(无论是“纽约”还是“曼哈顿”)总是最不具体的(如果它是一个自治市镇,那么我们不必担心城市,如果它是街道,我们不要不必担心自治市镇等。)
因此,反转标记并递归,寻找完整命中(“曼哈顿”)或关键字(“Avenue”,“Street”,“New”),指示语义元素的开头或结尾。通过后,您可能会:
"5th Avenue" -> TOKEN STREET_END_TOKEN
"Manhattan" -> BOROUGH
"New York" -> COMPOUND_BEGIN_TOKEN TOKEN
"5th Avenue Manhattan" -> TOKEN STREET_END_TOKEN BOROUGH
"5th Avenue Manhattan New York" -> TOKEN STREET_END_TOKEN BOROUGH COMPOUND_BEGIN_TOKEN TOKEN
"Manhattan New York" -> BOROUGH COMPOUND_BEGIN_TOKEN TOKEN
"5th Avenue New York" -> TOKEN STREET_END_TOKEN COMPOUND_BEGIN_TOKEN TOKEN
哪个应该给你足够的模式匹配。
更新:
好的,扩展一般战略:
Step 1 : Generate a pattern of the query structure by identifying keywords ("Manhattan"), and semantically-meaningful ("Street", "Avenue") or grammatically-significant ("New", "Saint") tokens.
Step 2: Match the generated pattern against a set of templates -- "* BOROUGH *" -> (Street) (BOROUGH) (City)", "* STREET_END_TOKEN" -> (Street name) (Street type), etc.
Step 3: The result of Step 2 ought to give you a sense of what kind of query you're dealing with. You'll have to apply domain rules at that point (if you know the complete query is TOKEN STREET_END_TOKEN then you know "Well, this is a query that just specifies a street" and you have to apply whatever rule is appropriate (grab the locale of their browser? Use their query history to guess which neighborhood and city? etc.)