Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQLServer数据库中进行提前键入搜索_Sql Server_Django_Indexing_Linked Server_Type Ahead - Fatal编程技术网

Sql server 如何在SQLServer数据库中进行提前键入搜索

Sql server 如何在SQLServer数据库中进行提前键入搜索,sql-server,django,indexing,linked-server,type-ahead,Sql Server,Django,Indexing,Linked Server,Type Ahead,我正在用Django为一个有角度的前端应用程序编写后端API。我使用的是SQL server数据库和链接服务器。在前端,我想使用提前输入搜索员工。例如,在前端,如果我想搜索名为“莉莎”的员工,那么在键入姓名时,数据将从数据库(链接服务器)中获取 目前我使用的查询如下: select * from openquery([LinkedServer], 'select employeeName from "DB"."View" where "employeeName" LIKE "%Lisha%"')

我正在用Django为一个有角度的前端应用程序编写后端API。我使用的是SQL server数据库和链接服务器。在前端,我想使用提前输入搜索员工。例如,在前端,如果我想搜索名为“莉莎”的员工,那么在键入姓名时,数据将从数据库(链接服务器)中获取

目前我使用的查询如下:

select * from openquery([LinkedServer], 'select employeeName from "DB"."View" where "employeeName" LIKE "%Lisha%"')
查询将搜索所有名称,如“Lisha”,然后返回我发送到前端的结果集。但我想要的是,只要用户键入“L”,结果就会开始出现,我就可以将结果发送到前端,而无需等待所有名称的“L”查询完成

我使用的查询非常慢,因为它等待所有包含“Lisha”的名称完成,然后将结果集发送到前端


如何加快速度以及如何使用提前键入搜索?

从您想要实现的目标来看,我建议在用户开始键入并向用户返回请求中搜索词的有限(比如20)组结果时,从angular应用程序向后端发送请求。如果用户已键入下一个字符,且当前请求尚未完成,则取消当前请求并切换到新请求。您还可以添加“去盎司时间”,以便在用户在发送请求之前暂停键入后等待特定时间。示例如下:

  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);
  }
公共搜索(searchTerm:可观察):任何{
返回搜索项.pipe(
//在发送请求之前等待500毫秒
去BounceTime(500),
//仅当当前搜索词与以前的搜索词不同时才发送请求
//术语
distinctUntilChanged(),
//如果未完成,请取消请求,并提出新请求
开关映射(术语=>
term.trim().length>2?此.getSearchTerm(term):共([])
),
映射(响应=>{
const name=this.filterName(响应);
控制台日志(地址);
回信地址;
})
);
}
私人getSearchTerm(术语){
const apiURL=`${your base url}提前键入搜索?searchString=${term}`;
返回this.http.get(apirl);
}
搜索结果取决于后端实现。我建议,不要在自动完成的查询中使用“like”来搜索文本。正则表达式是一种用于查找文本模式的简洁灵活的表示法


我使用elasticsearch作为后端实现。如果您感兴趣,您可能会喜欢阅读以及如何阅读。

您的查询将搜索任何包含“丽莎”的姓名。这就是你想要的吗?或者你想找到以“莉莎”开头的名字吗?希望您在employeeName上有一个索引,但是由于在搜索词的开始和结束处使用了%,您每次提交该查询时都要进行索引扫描。“Lisha”可以出现在任何地方,因为它可以是名字、姓氏或中间名,或者如果用户使用电子邮件id或用户名进行搜索,它可以出现在任何地方