首页 > 解决方案 > 阿拉伯语字符串的 Firebase 查询请求不起作用。仅适用于英文字符串

问题描述

我有一个代码来检查用户名是否已经被使用,如果用户名以英语(或一般的拉丁字母)存在,它可以正常工作,但如果用户名已经以阿拉伯语存在,则查询找不到现有的用户名。请看下面我的代码。

                                //Check if the user is already exist
final Query query =  databaseReference.child("users").orderByChild("uNm").equalTo(userNameText);
                            query.addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                    if(dataSnapshot.getChildrenCount() > 0){
                                        System.out.println ("this is user in query username :" + dataSnapshot.getValue().toString());
                                        Toast toast = Toast.makeText(ProfileEditing.this, "    The username is already taken    ", Toast.LENGTH_LONG);

userNameText 是用户想要使用的新键入的用户名。如果 userNameText 是英文并且用户名已经存在,则查询有效并找到它。如果 userNameText 是阿拉伯语并且用户名已经存在,则查询不起作用并且找不到它。

感谢有人可以提供帮助!

标签: javaandroidfirebaseandroid-studiofirebase-realtime-database

解决方案


1-首先,将 ML Kit Android 库的依赖项添加到您的模块(应用级)Gradle 文件(通常是 app/build.gradle)中:

 implementation 'com.google.firebase:firebase-ml-natural-language:22.0.0'
  implementation 'com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7'

2-识别字符串的语言,获取FirebaseLanguageIdentification的实例,然后将字符串传递给identifyLanguage()方法。

FirebaseLanguageIdentification languageIdentifier =
        FirebaseNaturalLanguage.getInstance().getLanguageIdentification();
languageIdentifier.identifyLanguage(text)
      .addOnSuccessListener(
          new OnSuccessListener<String>() {
            @Override
            public void onSuccess(@Nullable String languageCode) {
              if (languageCode != "und") {
                Log.i(TAG, "Language: " + languageCode);
              } else {
                Log.i(TAG, "Can't identify language.");
              }
            }
          })
      .addOnFailureListener(
          new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
              // Model couldn’t be loaded or other internal error.
              // ...
            }
          });

3-默认情况下,ML Kit 仅在识别出置信度值至少为 0.5 的语言时才返回 und 以外的值。您可以通过将 FirebaseLanguageIdentificationOptions 对象传递给 getLanguageIdentification() 来更改此阈值:

FirebaseLanguageIdentification languageIdentifier = FirebaseNaturalLanguage
        .getInstance()
        .getLanguageIdentification(
                new FirebaseLanguageIdentificationOptions.Builder()
                        .setIdentifyLanguageConfidenceThreshold(0.34f)
                        .build());

4-要获取字符串最可能语言的置信度值,请获取 FirebaseLanguageIdentification 的实例,然后将字符串传递给 identifyAllLanguages() 方法。

FirebaseLanguageIdentification languageIdentifier =
        FirebaseNaturalLanguage.getInstance().getLanguageIdentification();
languageIdentifier.identifyAllLanguages(text)
      .addOnSuccessListener(
          new OnSuccessListener<String>() {
            @Override
            public void onSuccess(List<IdentifiedLanguage> identifiedLanguages) {
              for (IdentifiedLanguage identifiedLanguage : identifiedLanguages) {
                String language = identifiedLanguage.getLanguageCode();
                float confidence = identifiedLanguage.getConfidence();
                Log.i(TAG, language + " (" + confidence + ")");
              }
            }
          })
      .addOnFailureListener(
          new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
              // Model couldn’t be loaded or other internal error.
              // ...
            }
          });

5- 默认情况下,ML Kit 仅返回置信度值至少为 0.01 的语言。您可以通过将 FirebaseLanguageIdentificationOptions 对象传递给 getLanguageIdentification() 来更改此阈值:

FirebaseLanguageIdentification languageIdentifier = FirebaseNaturalLanguage
        .getInstance()
        .getLanguageIdentification(
                new FirebaseLanguageIdentificationOptions.Builder()
                        .setIdentifyAllLanguagesConfidenceThreshold(0.5f)
                        .build());

使用上面的5个步骤


推荐阅读