firebase 如何在Flutter中使用Firestore搜索文本

dgtucam1  于 2022-11-25  发布在  Flutter
关注(0)|答案(3)|浏览(106)

我想通过一个查询来实现使用云Firestore的搜索功能,但没有得到任何与获取数据相关的查询。我在谷歌上搜索了很多东西,但到处都是唯一的建议是首先从云Firestore获取所有数据,然后在本地搜索。我检查了查询中的where条件,但没有找到任何条件,如“开始于”等。

我想按名称参数搜索。

nbnkbykc

nbnkbykc1#

Firestore没有内置的全文搜索功能。我常用的两个查询操作符是:

  • 使用isEqualTo:查找字段与值完全匹配的文档。
  • 使用isGreaterThanOrEqualTo:isLessThanOrEqualTo:(或startAt:endAt:)搜索字段以特定值开头的文档。

例如,若要搜索所有nameal开头的文档,可以使用collectionRef.where("name", isGreaterThanOrEqualTo: "al").where("name", isLessThanOrEqualTo: "al\uf7ff")。这里的\uf7ff只是最后一个已知的Unicode字符,因此查询在处理完每个al后就停止返回结果。
如果您需要任何其他文本搜索操作,则需要使用其他解决方案--例如记录为here的Algolia。

axzmvihb

axzmvihb2#

这段代码在使用firestone flutter搜索文本时非常有帮助

StreamBuilder(
    stream: ( searchtxt!= "" && searchtxt!= null)?FirebaseFirestore.instance.collection("addjop").where("specilization",isNotEqualTo:searchtxt).orderBy("specilization").startAt([searchtxt,])
        .endAt([searchtxt+'\uf8ff',])
        .snapshots()
        :FirebaseFirestore.instance.collection("addjop").snapshots(),
    builder:(BuildContext context,snapshot) {
      if (snapshot.connectionState == ConnectionState.waiting &&
          snapshot.hasData != true) {
        return Center(
            child:CircularProgressIndicator(),
        );
      }
      else
        {retun widget();
  }
})
dxxyhpgq

dxxyhpgq3#

对于像名字这样的短字符串有一种方法。我们在我们的应用程序中经常使用这种方法。你可以把名字分成几个小部分,然后把它们添加到一个数组中。要用全文搜索来搜索名字,请等待至少有3个字母,然后使用array-contains-any查询来检查字母组合是否是数组的一部分。
拆分到数组代码:

const MAPPING_TABLE = {
  à: 'a',
  á: 'a',
  â: 'a',
  ã: 'a',
  å: 'a',
  æ: 'ae',
  ç: 'c',
  è: 'e',
  é: 'e',
  ê: 'e',
  ë: 'e',
  ì: 'i',
  í: 'i',
  î: 'i',
  ï: 'i',
  ñ: 'n',
  ò: 'o',
  ó: 'o',
  ô: 'o',
  õ: 'o',
  ù: 'u',
  ú: 'u',
  û: 'u',
  ý: 'y',
  ÿ: 'y',
}

function splitStringToArray(stringToSplit) {
  const listCharacters = stringToSplit.split('')
  var output = []
  //replace special Characters
  for (var i = 0; i < listCharacters.length; i++) {
    if (MAPPING_TABLE[listCharacters[i]] != null) {
      listCharacters[i] = MAPPING_TABLE[listCharacters[i]]
    }
  }
  for (var i = 0; i < listCharacters.length; i++) {
    var temp = [listCharacters[i]]
    for (var j = i + 1; j < listCharacters.length; j++) {
      temp.push(listCharacters[j])
      const joinedString = temp.join('').toLowerCase()
      if (joinedString.length > 2) {
        output.push(joinedString)
      }
    }
  }
  return output
}

export default splitStringToArray

下面是一个用于搜索名称的查询:

ref = ref.where("search", "array-contains-any", [value.toLowerCase()]);

const snap = await ref.limitToLast(20).get();

我也会把结果限制在一个现实的元素数量。

相关问题