【问题标题】:Creating an auto complete search using angularfire2 and firestore?使用 angularfire2 和 firestore 创建自动完成搜索?
【发布时间】:2018-05-30 04:21:55
【问题描述】:

我正在尝试为我的网络应用构建一个简单的搜索功能。 有关于如何使用实时数据库创建它的文档。

我需要进行哪些更改才能在 firestore 上进行这项工作?

本教程取自https://angularfirebase.com/lessons/autocomplete-search-with-angular4-and-firebase/

它也有一个不错的视频:)

这是使用实时数据库的方法:

#movies.service.ts
import { Injectable } from '@angular/core';
import { AngularFireDatabase, FirebaseListObservable } from ' 
angularfire2/database';
@Injectable()
export class MoviesService {
  constructor(private db: AngularFireDatabase) { }
  getMovies(start, end): FirebaseListObservable<any> {
    return this.db.list('/movies', {
      query: {
        orderByChild: 'Title',
        limitToFirst: 10,
        startAt: start,
        endAt: end
      }
    });
  }
}

自动完成搜索组件

 <h1>Movie Search</h1>
 <input type="text" (keydown)="search($event)" placeholder="search 
  movies..." class="input">
  <div *ngFor="let movie of movies">
    <h4>{{movie?.Title}}</h4>
    <p>
     {{movie?.Plot}}
   </p>
 </div>
<div *ngIf="movies?.length < 1">
  <hr>
  <p>
    No results found :(
  </p>
</div>

TS

import { Component, OnInit } from '@angular/core';
import { MoviesService } from '../movies.service';
import { Subject } from 'rxjs/Subject'
@Component({
  selector: 'movie-search',
  templateUrl: './movie-search.component.html',
  styleUrls: ['./movie-search.component.scss']
})
export class MovieSearchComponent implements OnInit {
  movies;
  startAt = new Subject()
  endAt = new Subject()
  constructor(private moviesSvc: MoviesService) { }
  ngOnInit() {
    this.moviesSvc.getMovies(this.startAt, this.endAt)
                  .subscribe(movies => this.movies = movies)
  }
  search($event) {
      let q = $event.target.value
      this.startAt.next(q)
      this.endAt.next(q+"\uf8ff")
  }
}

【问题讨论】:

    标签: angular firebase firebase-realtime-database angularfire2 google-cloud-firestore


    【解决方案1】:

    Firestore 也差不多。

    这是我刚刚写的有效且经过测试的解决方案:

    search.ts

    import { Component } from '@angular/core';
    import { AngularFirestore } from 'angularfire2/firestore';
    
    @Component({
      selector: 'search',
      templateUrl: 'search.html'
    })
    export class SearchComponent {
    
      searchValue: string = "";
      results: any;
    
      constructor(public afs: AngularFirestore) {
      }
    
      search() {
        let self = this;
        self.results = self.afs.collection(`users`, ref => ref
          .orderBy("username")
          .startAt(self.searchValue.toLowerCase())
          .endAt(self.searchValue.toLowerCase()+"\uf8ff")
          .limit(10))
          .valueChanges();
      }
    
    }
    

    search.html

    <div>
      <input type="text" (keyup)="search()" [(ngModel)]="searchValue">
      <div class="search-results">
        <div class="search-result" *ngFor="let result of results | async">
          {{ result.username }}
        </div>
      </div>
    </div>
    

    如果您需要更复杂的搜索,可以使用 Algolia:

    要启用对 Cloud Firestore 数据的全文搜索,请使用 Algolia 等第三方搜索服务。考虑一个笔记应用程序,其中每个笔记都是一个文档:

    您可以在official firestore documentation 上找到更多信息

    【讨论】:

      【解决方案2】:

      您在使用 Firestore 时将面临的问题是延迟问题。不确定这是否是因为它仍处于测试阶段,但读取的延迟高得令人担忧。

      【讨论】:

      • 您对我有什么建议吗?我可以使用实时数据库进行搜索
      • Apache Solr 但这是另一个需要熟悉的新技术。否则,如果数据集很小,请将其保存在内存中以加快处理速度。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2019-05-01
      • 2016-06-13
      • 2017-04-12
      • 1970-01-01
      • 2012-06-03
      相关资源
      最近更新 更多