Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana melakukan penyorotan hasil dari kueri teks lengkap SQL Server

Memperluas ide Ismail, itu bukan solusi akhir, tapi saya pikir itu cara yang baik untuk memulai.

Pertama kita perlu mendapatkan daftar kata yang telah diambil dengan mesin teks lengkap:

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'

Sudah cukup banyak yang bisa dikembangkan, misalnya pola pencariannya cukup mendasar; juga mungkin ada cara yang lebih baik untuk menyaring kata-kata yang tidak Anda butuhkan, tetapi setidaknya ini memberi Anda daftar kata dasar dll. yang akan dicocokkan dengan pencarian teks lengkap.

Setelah Anda mendapatkan hasil yang Anda butuhkan, Anda dapat menggunakan RegEx untuk mengurai set hasil (atau sebaiknya hanya subset untuk mempercepatnya, meskipun saya belum menemukan cara yang baik untuk melakukannya). Untuk ini saya cukup menggunakan dua while loop dan sekumpulan tabel dan variabel sementara:

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

Beberapa catatan:
1. Perulangan while bersarang mungkin bukan cara yang paling efisien untuk melakukannya, namun tidak ada hal lain yang terlintas dalam pikiran. Jika saya menggunakan kursor, pada dasarnya akan sama?
2. @FirstSearchWord di sini untuk merujuk ke contoh pertama dalam teks dari salah satu kata pencarian asli, jadi pada dasarnya teks yang Anda ganti hanya akan ada di ringkasan. Sekali lagi, ini adalah metode yang cukup mendasar, semacam algoritme pencarian klaster teks mungkin akan berguna.
3. Untuk mendapatkan RegEx di tempat pertama, Anda memerlukan fungsi yang ditentukan pengguna 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. Kesalahan impor menggunakan Openrowset

  2. Kunci pesimistis di T-SQL

  3. Layanan SQL Server tidak tersedia dalam daftar layanan setelah instalasi SQL Server Management Studio

  4. Bagaimana cara mencetak VARCHAR(MAX) menggunakan Pernyataan Cetak?

  5. SQL Server ganti, hapus semua setelah karakter tertentu