我正在Django中为Angular前端应用程序编写后端API。我正在使用SQL服务器数据库和链接服务器。在前端,我想对员工使用预输入搜索。对于前。在前端,如果我要搜索名称为“ Lisha”的员工,则在键入名称本身时,将从数据库(链接服务器)中获取数据。
当前我正在使用类似的查询:
select * from openquery([LinkedServer], 'select employeeName from "DB"."View" where "employeeName" LIKE "%Lisha%"')
查询将搜索所有名称,例如'Lisha',然后返回我发送到前端的结果集。但是我想要的是,只要用户键入“ L”,结果就应该开始出现,并且我可以将结果发送到前端,而不必等待具有“ L”查询的所有名称都完成。
我正在使用的查询非常慢,因为它等待所有具有'Lisha'的名称都完成,然后将结果集发送到前端。
如何提高速度,以及如何使用预先输入搜索?
根据您想要实现的目标,我建议您从角度应用程序向后端发送请求,因为用户开始输入并针对请求中的搜索词向用户返回了一组有限的(例如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 Queries和Edge NGram Tokenizer有关操作方法的信息。