我正在尝试使用python找到一种方法将用户搜索查询与搜索引擎中的数据库记录相匹配,但是当搜索查询包含特殊字符(如带重音的元音)时,我遇到了麻烦。
例如:搜索查询='cafe'。数据库记录='café'
我正在使用词干来查询数据库记录。
哪种匹配查询最直接的方法,包括特殊字符'café'与不包含此特殊字符'cafe'的字符串,反之亦然?
更新
我需要的所有信息都已缓存,因此在数据库中创建新列的方法并不那么吸引人。我正在寻找一个更基于python的解决方案。
答案 0 :(得分:0)
实际上很少有这样做的方法。
我的猜测是最简单,最简单(但不是最好)的方法,通过创建特殊的地图,使用可以互相替换的字符,而不是通过使用该地图创建查询: / p>
# -*- coding: utf-8 -*-
SPECIAL_CHARACTERS_MAP = {
'e': u'[eé]',
}
def get_query(string):
pattern_value = u''
for s in string:
pattern_value += s if s not in SPECIAL_CHARACTERS_MAP else SPECIAL_CHARACTERS_MAP[s]
query = u"SELECT * FROM table WHERE record LIKE '%{}%'".format(pattern_value)
return query
print get_query(u'ewqeé')
# SELECT * FROM table WHERE record LIKE '%[eé]wq[eé]é%'
# Code to query database ....
因此,您可以使用'a': 'u[aà]'
等更多案例扩展您的地图。
另一种选择是在数据库中创建单独的列并通过使用非常类似的数据结构(例如上面的SPECIAL_CHARACTERS_MAP
)来填充该列并替换特殊字符,旨在使您更容易替换字符,但是在将搜索词传递到LIKE
查询之前,您必须执行相同的替换。
SQL Wildcards使用完整的事物信息来创建与SELECT
运算符执行LIKE
查询时要匹配的字符串。
答案 1 :(得分:0)
我最终使用以下代码解决了这个问题:
unicodedata.normalize('NFKD', "café").encode('ascii', 'ignore')
返回
cafe
此方法还可以修正以下字符:ü,ö,á,é,í,ó,ú,ü,ñ,ī