【问题标题】:Django filter - iregex to match complete word onlyDjango 过滤器 - ire​​gex 仅匹配完整的单词
【发布时间】:2013-11-28 20:21:14
【问题描述】:

所以我一直在尝试实现用户可以输入关键字并查找用户的搜索功能。搜索方法应该在用户的字段中查找精确的单词匹配,例如名字、姓氏、工作等

我尝试过 icontains,但它也会在单词中匹配,例如,如果用户输入“a”,搜索将返回包含“a”的任何内容。 (这是我在决定解决问题之前最初所做的)

我尝试了iexact,但这显然会给出完全匹配,如果用户输入“john”,它将跳过名字为“john doe”或其他名称的用户。

所以经过一番谷歌搜索后,我找到了两个 stackoverflow 线程

django filter icontains match whole words only

Whole-word match only in Django query

因为我使用的是 postgresql,所以我改用 \y 而不是 \b。现在我正在使用的查询是

results = User.objects.filter(first_name__iregex=r"\y{0}\y".format(first))

我也试过了,其他方法在我提到的两个线程中列出。

results = User.objects.filter(first_name__iregex=r"\y%s\y"%first)

问题是它没有返回任何东西。在调试时,我检查了正在生成的查询,据我所知,它似乎是正确的。

WHERE `LinkedApp_user`.`first_name` REGEXP \yahsan\y 

我的数据库目前有大约 5 个用户,其中一个的名字是“ahsan”,另一个的名字是“ahsan saleem”。但是,此查询不返回任何内容。非常感谢任何帮助。

编辑:我尝试切换到 SQLite 并用 \b 更改 \y 并且搜索似乎已经开始工作。但是我不能使用 sqlite,如果有人可以指导我,我将不胜感激。

另一个编辑:我已经通过切换数据库解决了我的 postgresql 问题。总之是个愚蠢的错误。问题是您将如何使用 mysql 进行这项工作,我尝试过的所有方法都失败了。

【问题讨论】:

  • "Since I am using postgresql I switched to using /y instead of /b." - 你有没有尝试过使用\b看看它是否真的不起作用?
  • 抱歉打错了,因为我说它不起作用。
  • 是的,\b 适用于 Sqlite,我也对其进行了测试。您是否尝试过不使用 django 运行查询并查看它是否有效?也许 postgresql 是区分大小写的,你试过搜索Ahsan 吗?
  • 我切换了我的数据库,它现在可以工作了。尽管如此,仍然无法使其与我的本地 mysql 一起使用。 \y 适用于 postgresql。并且大小写无关紧要,因为我使用的是 iregex 而不是正则表达式。感谢您的帮助,但如果您能指出为什么它不适用于 mysql 将不胜感激
  • 只是想让你们知道,到目前为止,我还没有找到让它在 MYSQL 上运行的方法。在 Sqlite 和 Postgresql 上运行良好!

标签: python sql regex django-postgresql


【解决方案1】:

在 MySQL 中,单词边界由 [[:<:>:]] (http://dev.mysql.com/doc/refman/5.7/en/regexp.html) 匹配

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多