0

我試圖用基於SQL Server 2008 R2的基於關鍵字分析器的Lucene.NET索引替換基於關鍵字分析器的索引。SQL全文索引器,完全匹配和轉義

我有一個表包含我需要查詢的自定義索引字段。索引列的值(見下文)是一系列.NET類型的自定義索引字段的名稱/值對的組合 - 實際值在運行時從屬性拉取,因爲結構未知。

我需要能夠使用AND和OR搜索集名稱和值對,並返回查詢匹配的行。

Id   Index 
==================================================================== 
1   [Descriptor.Type]=[5][Descriptor.Url]=[/] 
2   [Descriptor.Type]=[23][Descriptor.Url]=[/test] 
3   [Descriptor.Type]=[25][Descriptor.Alternative]=[hello] 
4   [Descriptor.Type]=[26][Descriptor.Alternative]=[hello][Descriptor.FriendlyName]=[this is a test] 

一個簡單的查詢,如下所示:

select * from Indices where contains ([Index], '[Descriptor.Url]=[/]'); 

該查詢將在下面的錯誤結果:

Msg 7630, Level 15, State 2, Line 1 
Syntax error near '[' in the full-text search condition '[Descriptor.Url]=[/]'. 
考慮到這一點

所以,我在Index改變了數據使用|而不是[]

現在
select * from Indices where contains ([Index], '|Descriptor.Url|=|/|'); 

,而查詢現在是有效的,當我運行它含有Descriptor.Url/開始返回,而不是記錄(只有一個在這種情況下)完全匹配的所有行。

我的問題是,我怎麼能逃避查詢佔[]並確保返回只是確切匹配行?

一個更復雜的查詢看起來有點像這樣:

select * from Indices where contains ([Index], '[Descriptor.Type]=[12] AND ([Descriptor.Url]=[/] OR [Descriptor.Url]=[/test])'); 

感謝,
基隆

回答

1

你的主要問題是使用SQL分詞系統,幷包含語法。默認情況下,SQL wordbreakers消除標點符號,並規範化數字,日期,網址,電子郵件地址等。它也降低了一切,並且干擾了詞語。

因此,對於您輸入的字符串:

[Descriptor.Type]=[5][Descriptor.Url]=[/]

你將不得不加入到索引中的下列標記(連同其位置)

descriptor type nn5 5 descriptor url

(注:NN5是一種方法,簡化不同格式的查詢號碼和日期,原始號碼也被索引在同一位置)

因此,正如您所看到的,點號甚至不存儲在整個t ext索引,因此,無法使用CONTAINS語句來查詢它。

所以,你的發言:

select * from Indices where contains ([Index], '|Descriptor.Url|=|/|'); 

實際上由查詢生成器提交給全文索引,從而命中上所有具有「描述」中的條目之前被歸到「描述符URL」旁邊的「網址」,不包括標點符號。

你需要的是LIKE statement

0

使用 「|」因爲分隔符會導致包含查詢想到OR。這就是爲什麼你會得到意想不到的結果。你應該能夠逃脫支架,像這樣:

SELECT * FROM Indices WHERE 
    contains ([Index], '[[]Descriptor.Type]=[[]12]') 
+0

我已經嘗試過,但我最大的擔心是返回不正確的結果。謝謝。 – Kieron 2011-02-09 20:13:37