SQL全文在多列

时间:2016-03-27 07:25:52

标签: sql sql-server tsql full-text-search sql-server-2014

我的应用程序将客户名称存储在3列中,但使用单个参数触发搜索。我正在尝试实施FULLTEXT搜索以有效搜索此客户数据库。

我正在寻找名字

  

RIMA HUSSEIN

我使用以下TSQL来搜索起始字。

SELECT 
    REM_ID, REM_FNAME, REM_MNAME, REM_LNAME 
FROM 
    dbo.tblM_REMMASTER 
WHERE 
    CONTAINS((REM_FNAME , REM_MNAME, REM_LNAME) ,'"RIMA*"')

查询按预期工作,为我提供了良好的搜索结果。

enter image description here

如果我提供带有短语的更新查询,则此方案不会向我提供任何结果。

执行示例测试查询以尝试解决方案。

SELECT 
    REM_ID, REM_FNAME, REM_MNAME, REM_LNAME 
FROM 
    dbo.tblM_REMMASTER 
WHERE 
    CONTAINS((REM_FNAME , REM_MNAME, REM_LNAME), '"rima*" AND "*hussein"') 

SELECT 
    REM_ID, REM_FNAME, REM_MNAME, REM_LNAME  
FROM 
    dbo.tblM_REMMASTER 
WHERE 
   CONTAINS(REM_FNAME  ,'"RIMA HUSSEIN"')

SELECT 
    REM_ID, REM_FNAME, REM_MNAME, REM_LNAME 
FROM 
    dbo.tblM_REMMASTER 
WHERE 
    CONTAINS((REM_FNAME , REM_MNAME, REM_LNAME)  ,'NEAR ((RIMA,HUSSEIN),MAX,TRUE)')

之前是否有人面临此问题或在此特定情况下可以实施哪种解决方案逻辑?

在没有全文的实时环境中测试的示例查询:

SET @NAME=N'RIMAHUSSEIN'

SELECT  
    REM_ID, REM_FNAME, REM_MNAME, REM_LNAME 
FROM 
    dbo.tblM_REMMASTER WITH (READPAST) 
WHERE
    ((LTRIM(RTRIM(REM_FNAME)) +  LTRIM(RTRIM(REM_MNAME)) + LTRIM(RTRIM(REM_LNAME)) LIKE '%' + @NAME + '%'))

2 个答案:

答案 0 :(得分:3)

我们的应用程序必须在表格的几乎每个列中进行搜索,因此我们创建一个视图WITH SCHEMABINDINGCLUSTERED INDEX,结构如下:

CREATE VIEW search_view
WITH SCHEMABINDING
AS
SELECT  id,
        column1 + ' ' + column2 + etc as search_text
FROM table

CREATE CLUSTERED INDEX ci_id ON search_view (id);

并在search_text列上添加全文索引。 然后我们只是:

SELECT ...
FROM table t
INNER JOIN CONTAINSTABLE(search_view, search_text, '"word1*" AND "word2*" ... ') AS sv
    ON t.ID = sv.ID

答案 1 :(得分:0)

试一试..

SELECT * FROM dbo.tblM_REMMASTER WHERE CONTAINS((REM_FNAME,REM_MNAME, REM_LNAME) ,'"RIMA*"') 
AND  CONTAINS((REM_FNAME , REM_MNAME, REM_LNAME), '"*hussein"')