Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да направите маркиране на резултати от пълнотекстова заявка на SQL Server

Разширявайки идеята на Исмаил, това не е окончателното решение, но мисля, че е добър начин да започнете.

Първо трябва да получим списъка с думи, които са били извлечени с машината за пълен текст:

declare @SearchPattern nvarchar(1000) = 'FORMSOF (INFLECTIONAL, " ' + @SearchString + ' ")' 
declare @SearchWords table (Word varchar(100), Expansion_type int)
insert into @SearchWords
select distinct display_term, expansion_type
from sys.dm_fts_parser(@SearchPattern, 1033, 0, 0)
where special_term = 'Exact Match'

Вече има доста неща, върху които може да се разшири, например моделът на търсене е доста основен; също така вероятно има по-добри начини да филтрирате думите, които не ви трябват, но най-малкото ви дава списък с основни думи и т.н., които биха били съпоставени при търсене в пълен текст.

След като получите нужните резултати, можете да използвате RegEx, за да анализирате набора от резултати (или за предпочитане само подмножество, за да го ускорите, въпреки че все още не съм измислил добър начин да го направя). За това просто използвам два цикъла while и куп временни таблици и променливи:

declare @FinalResults table 
while (select COUNT(*) from @PrelimResults) > 0
begin
    select top 1 @CurrID = [UID], @Text = Text from @PrelimResults
    declare @TextLength int = LEN(@Text )
    declare @IndexOfDot int = CHARINDEX('.', REVERSE(@Text ), @TextLength - dbo.RegExIndexOf(@Text, '\b' + @FirstSearchWord + '\b') + 1)
    set @Text = SUBSTRING(@Text, case @IndexOfDot when 0 then 0 else @TextLength - @IndexOfDot + 3 end, 300)

    while (select COUNT(*) from @TempSearchWords) > 0
    begin
        select top 1 @CurrWord = Word from @TempSearchWords
        set @Text = dbo.RegExReplace(@Text, '\b' + @CurrWord + '\b',  '<b>' + SUBSTRING(@Text, dbo.RegExIndexOf(@Text, '\b' + @CurrWord + '\b'), LEN(@CurrWord) + 1) + '</b>')
        delete from @TempSearchWords where Word = @CurrWord
    end

    insert into @FinalResults
    select * from @PrelimResults where [UID] = @CurrID
    delete from @PrelimResults where [UID] = @CurrID
end

Няколко бележки:
1. Вложените цикли while вероятно не са най-ефективният начин да го направите, но нищо друго не идва на ум. Ако трябваше да използвам курсори, по същество щеше да е същото?
2. @FirstSearchWord here to се отнася до първата инстанция в текста на една от оригиналните думи за търсене, така че по същество текстът, който замествате, ще бъде само в резюмето. Отново, това е доста основен метод, някакъв алгоритъм за намиране на текстови клъстери вероятно би бил удобен.
3. За да получите RegEx на първо място, имате нужда от CLR потребителски дефинирани функции.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MS SQL Server и JDBC:затворена връзка

  2. pyodbc не може да се свърже с базата данни

  3. SQL Server 2008 Генериране на поредица от дати и часове

  4. SQL Server:Как да съхранявате двоични данни (напр. Word файл)?

  5. SQL Server, преобразуващ varbinary в низ