Django Python阿拉伯语搜索

8hhllhi2  于 2023-05-30  发布在  Go
关注(0)|答案(1)|浏览(186)

我有字段nameauthor这是在阿拉伯语,我想对他们的关键字搜索

keyword = request.POST.get('search', '')
books = Book.objects.filter(Q(name__icontains=keyword)).order_by('category', 'code')

问题是django将两个字母''和'ا'视为两个不同的字母,而用户希望它们在搜索中可以互换,并且两者应该给予相同的输出。有没有一种方法可以将它们视为一个字母,而不用在代码的变体中替换它们?像这样

keyword_var1 = keyword.replace('أ', 'ا')

字母''和'li'也有同样的问题

ig9co6j1

ig9co6j11#

这个问题是已知的,但不是Django特有的。Django没有定义自定义不敏感搜索的工作方式,这是数据库的工作。在排序或检查等价性时如何处理字符的规则集是 collation
这个Medium article by Ahmed Essam解释了简单的utf8_unicode_ci排序的问题。如果我对这篇文章的理解是正确的,那么Unicode排序规则有一些缺点。根据数据库的不同,您可以构建一个自定义排序规则,例如,如本文所示:

<collation name="utf8_arabic_ci" id="1029">
  <rules>
      <reset>\u0627</reset>   <!-- Alef 'ا' -->
      <i>\u0623</i>           <!-- Alef With Hamza Above 'أ' -->
      <i>\u0625</i>           <!-- Alef With Hamza Below 'إ' -->
      <i>\u0622</i>           <!-- Alef With Madda Above 'آ' -->
  </rules>
  <rules>
      <reset>\u0629</reset>   <!-- Teh Marbuta 'ة' -->
      <i>\u0647</i>           <!-- Heh 'ه' -->
  </rules>
  <rules>
      <reset>\u0000</reset>   <!-- Unicode value of NULL  -->
      <i>\u064E</i>           <!-- Fatha 'َ' -->
      <i>\u064F</i>           <!-- Damma 'ُ' -->
      <i>\u0650</i>           <!-- Kasra 'ِ' -->
      <i>\u0651</i>           <!-- Shadda 'ّ' -->
      <i>\u064F</i>           <!-- Sukun 'ْ' -->
      <i>\u064B</i>           <!-- Fathatan 'ً' -->
      <i>\u064C</i>           <!-- Dammatan 'ٌ' -->
      <i>\u064D</i>           <!-- Kasratan 'ٍ' -->
  </rules>
</collation>

它表明它将重写\u0623,使上面带有Hamza的Alef成为简单的Alef(u0627`),然后尝试匹配它。
然后,您可以将此排序规则算法设置为这些特定列的排序规则算法,以及可能使用阿拉伯语的其他列的排序规则算法。

相关问题