如何在SQL Server数据库中进行提前搜索

问题描述 投票:0回答:1

我正在Django中为Angular前端应用程序编写后端API。我正在使用SQL服务器数据库和链接服务器。在前端,我想对员工使用预输入搜索。对于前。在前端,如果我要搜索名称为“ Lisha”的员工,则在键入名称本身时,将从数据库(链接服务器)中获取数据。

当前我正在使用类似的查询:

select * from openquery([LinkedServer], 'select employeeName from "DB"."View" where "employeeName" LIKE "%Lisha%"')

查询将搜索所有名称,例如'Lisha',然后返回我发送到前端的结果集。但是我想要的是,只要用户键入“ L”,结果就应该开始出现,并且我可以将结果发送到前端,而不必等待具有“ L”查询的所有名称都完成。

我正在使用的查询非常慢,因为它等待所有具有'Lisha'的名称都完成,然后将结果集发送到前端。

如何提高速度,以及如何使用预先输入搜索?

sql-server django indexing linked-server type-ahead
1个回答
0
投票

根据您想要实现的目标,我建议您从角度应用程序向后端发送请求,因为用户开始输入并针对请求中的搜索词向用户返回了一组有限的(例如20个)结果。如果用户已经输入了下一个字符并且当前请求尚未完成,则取消当前请求并切换到新请求。您还可以添加“反跳时间”,以在用户暂停键入后等待一段时间,然后再发送请求。以下示例:

  public search(searchTerm: Observable<string>): any {
    return searchTerm.pipe(
     //wait for 500 milliseconds before sending the request
      debounceTime(500),
     //Send the request only if the current search term is different ftom previous search 
      //term
      distinctUntilChanged(),
    //Cancel the request if not completed, and make a new request
      switchMap(term =>
        term.trim().length > 2 ? this.getSearchTerm(term) : of([])
      ),
      map(response => {

        const name= this.filterName(response);
        console.log(address);
        return address;
      })
    );
  }

private getSearchTerm(term) {
    const apiURL = `${your-base-url}type-ahead-search?searchString=${term}`;
    return this.http.get(apiURL);
  }

您的搜索结果取决于您的后端实现。我建议,不要在自动完成查询中使用“喜欢”来使用regex搜索文本。正则表达式是用于查找文本模式的简洁灵活的表示法。

我将Elasticsearch用于后端实现。如果有兴趣,您可能希望阅读Prefix QueriesEdge NGram Tokenizer有关操作方法的信息。

© www.soinside.com 2019 - 2024. All rights reserved.