簡體   English   中英

SQL Server針對文檔的全文本搜索(多個相關表和字段)

[英]SQL Server Full-Text Search against Document (multiple related tables and field)

我有一個包含多個表的文檔(在本例中為Invoice)結構:

  • Invoice Header (編號(PK),客戶名稱,客戶地址等)

  • Invoice Lines (發票號(PK),行號(PK),描述,數量,...)

  • Invoice Header Comments (發票編號(PK),注釋編號(PK),注釋)

當我運行搜索時,我想針對整個文檔(作為一個實體,而不針對單獨的字段(客戶名稱+客戶地址+描述+注釋))執行搜索。

示例:與“自行車和柏林”或“慕尼黑或柏林”或“快速交付”有關的所有文檔。

您會建議采用哪種方法來解決此問題?

我是否應該創建單獨的索引表來存儲我要索引的所有字段(客戶名稱,客戶地址,描述,注釋)中的串聯值-每個文檔一行:

文檔索引 (文檔編號(PK),索引)在這種情況下,應如何使“文檔索引”表保持最新狀態?

我試圖創建連接值的索引視圖,但是受到限制-索引視圖不能包含子選擇或使用其他視圖。

我將不勝感激。

考慮到布爾搜索,多個列和表的需求,SQL全文本搜索將是最合適的方法。

該過程分為多個步驟,但是大致而言,您將需要:

  1. 創建全文目錄
  2. 為每個表創建一個全文索引
  3. 生成/建立索引
  4. 最后,在查詢中使用FT(目錄)

我強烈建議從“ 入門”文章開始 ,它將幫助您了解一些專業術語,結構以及如何在SQL Server中管理和使用全文本。

如果您需要對搜索結果進行排名(評分)或排序,則應創建一個新表,該表通過ETL流程將實體的所有全文可搜索數據(發票標題,行,注釋)組合為1柱。 這似乎是您對“文檔索引”表的建議所建議的。

為什么將它們組合成一張桌子? 與將全文索引應用於每個現有表相比,此方法可產生更好的排名。 前一種解決方案產生一個等級,而后一種解決方案將為每個表格產生一個不同的等級,並且沒有將多個等級(基於完全不同的標度)分解為1個等級的准確方法。 為了說明差異:

-- Querying 1 table
SELECT RANK, KEY FROM CONTAINSTABLE(DocumentIndex.*, @searchString)

-- Querying multiple tables (this results in multiple rank values which cannot be resolved into a single rank)
SELECT RANK, KEY FROM CONTAINSTABLE(InvoiceHeader.*, @searchString)

SELECT RANK, KEY FROM CONTAINSTABLE(InvoiceLines.*, @searchString)

SELECT RANK, KEY FROM CONTAINSTABLE(InvoiceHeaderComments.*, @searchString)

如何將它們組合成一張桌子? 您將需要某種ETL流程,該流程可以按計划運行(可能更易於實現,但會導致全文索引與主表不同步的滯后時間),或者每當主表按需運行時被修改(通過觸發器或通過掛接到數據層中的事件)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM