【问题标题】:How can I do full text search with Firebase without third-party integration?如何在没有第三方集成的情况下使用 Firebase 进行全文搜索?
【发布时间】:2020-11-02 14:08:37
【问题描述】:

我正在使用 Firestore 数据库构建地点应用程序,

PLaces:
  doc1:
   name: "Machin"
   category: "Pharmacy"
   city: "Paris"
 doc2:
   name: "Paris"
   category: "Pharmacy
   city: "New york"

  doc3:
   name: "Paris"
   category: "School
   city: "New york"

搜索是通过输入进行的,我希望用户可以按地点名称(带有自动完成功能)或带有名称的类别或带有名称的城市搜索......(在同一输入中), 因此,我们在这里讨论通过 THe No Exact value 的平均字段进行搜索。

这在 Cloud Firestore 中是否可行?没有第三方集成?

ElastikSearch 和 Algolia 之间最便宜的是什么

你如何看待这种方法here

【问题讨论】:

标签: firebase flutter google-cloud-firestore flutter-dependencies


【解决方案1】:

[基于 MD Jamal 的 Firestore Like 查询(YouTube 上的视频)]
如果你想做这样的事情--
假设在 Firestore 中,您有一个带有 tag

字段的文档

标签具有价值 - “我像熔岩一样冷”
[这里我假设您已经实现了 searchview 并准备好搜索]

现在,如果您在 searchview 中键入诸如“cold”或“like java”之类的内容,并且想要获取标签包含这些单词(查询)的那些文档,那么您必须 -

  1. 先在onQueryTextSubmit里面传一个方法searchData(s),传入里面的word(query)(就是String,或者默认可能是String查询)

       searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
             @Override
             public boolean onQueryTextSubmit(String s) {          
                 searchData(s); 
                 return false;
             }
             @Override
             public boolean onQueryTextChange(String newText) {
                 return false;
             }
         });
    
  2. 创建 searchData(s) 方法:

      private void searchData(String s) {
           db.collection("collection")
                   .get()
                   .addOnSuccessListener(queryDocumentSnapshots -> {
                     for (QueryDocumentSnapshot document : queryDocumentSnapshots) {
                         if (Objects.requireNonNull(document.getString("tags")).contains(s.toLowerCase()))
                             dataList.add(document.toObject(MainModel.class));
                     }
                     // update Adapter
                     Collections.shuffle(dataList);
                     adapter.notifyDataSetChanged();
                 });
     }
    

在上面的代码中,
我们使用 document.getString("tags") 获取 tag。如果您输入大写字母,还可以使用 s.toLowerCase()单词(查询)转换为小写。

之后,从行
if (Objects.requireNonNull(document.getString("tags")).contains(s.toLowerCase())),
我们正在检查 tag 是否有 word s(表示您输入的词),如果有,那么我们正在添加 document通过
dataList.add(document.toObject(MainModel.class));

进入我们的 dataList 之后,我们调用 Collections.shuffle(dataList); 来随机化数据,然后通过
adapter.notifyDataSetChanged(); 更新适配器

现在,如果您进行搜索,并且如果单词匹配,您将在您的 recyclerview/listview/anywhere 中获得该数据。
让我知道它是否有效
[对不起我的英语]

【讨论】:

    【解决方案2】:

    您可以尝试使用 where 并添加尽可能多的参数 您想在查询中查看我的示例片段:-

    List<DocumentSnapshot> documentList;
    documentList = (await Firestore.instance
        .collection("PLaces")
        .document(await firestoreProvider.getUid())
        .collection(caseCategory)
        .where("category, name, city", isEqualTo: query)
        .getDocuments())
        .documents;
    

    【讨论】:

    • 感谢您的评论,但我想要的是 sql 查询的“喜欢”=select where category like '%inputText%' or name="%sinputText% or .....跨度>
    • @Merym 请参考此链接:- medium.com/firebase-tips-tricks/…
    猜你喜欢
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多