天天看點

全文檢索4.5查詢文法

<b>一 文法概要</b><b></b>

select域名, 域名@Seg from 索引庫名稱 where 域名:域值 order by 域名(整型、浮點、日期、排序文本類型、枚舉類型)limit n classify by 域名 (或 merge by 域名)

l select的域必須是存儲域或枚舉域。域名後加上@Seg, 表示取包含查詢詞的片斷,可能包含多個片斷,用...分隔,域必須為文本類型。

l where條件域必須是索引域或枚舉域。

l order by的域必須存儲或是枚舉域,類型可以是整型(包括大整數類型)、浮點(包含單精度浮點數和雙精度浮點數)、日期型域,或是排序文本類型(文本域加上排序屬性),而不能是文本域。

l limit 是可選項,可取前n條資料,否則傳回所有的資料。

l classify by 的域必須包含SameContent屬性,可将相識的文檔合并。

l merge by的域必須是整型,将具有相同數值的文檔合并。

l where的基本文法為域名:域值,支援and , or,not 和 ( ) 組成布爾查詢。and 可以用 '&amp;' 或空格代替,or 可以用 '|' 代替, not 可以用 '!' 代替。

域名@Spell: 域值 表示拼音查詢,域值應為漢字,不是拼音。

域名@Syn: 域值 表示同義查詢,查詢所有和域值同義的詞。

域名@SplitAnd: 域值 表示将域值分詞後,再進行and查詢。

域名@SplitOr: 域值 表示将域值分詞後,再進行or查詢。

<b>二 詳細文法</b><b></b>

<b>1 轉義字元</b><b></b>

\ + - ! ( ) : ^ [ ] { } " ~ * ? | &amp;

這些符号在查詢文法中有特殊意義,如果要查詢符号本身,需要在前面加'\'。

注意:雙引号内除'"'和'\'外不用轉義。如'"c:\\dir"'而不是'"c\:\\dir"'。

例如:

查詢'*'可輸入'\*'。

查找路徑為'c:\dir\1.txt'的檔案可輸入'FounderFTSKey:c\:\\dir\\1.txt'。

(更友善的方式是'FounderFTSKey:"c:\\dir\\1.txt"')。

查詢'int_field:-1'可輸入'int_field:\-1'。

<b>2 布爾查詢</b><b></b>

<b>2.1 連接配接符:</b><b></b>

'A B' 或 'A and B' : A和B必須都出現。

'A or B' : A或B出現。

and優先級高于or。

<b>2.2 修飾符</b><b></b>

修飾符優先級高于連接配接符。

'!A' 'not A' : A不能出現。如'not A and B'(相當于(not A) and B)。

<b>3 短語查詢</b><b></b>

引号内的内容在源檔案中必須是連續的短語。如'A B C'查詢所有包含單詞A,B,C

的檔案,而'"ABC"'查詢所有包含短語"ABC"的檔案。

注意:引号内可以有引号("),需要用轉義符(\)轉義。如引号内的'\\'表示'\'。

<b>3.1 臨近查詢</b><b></b>

短語查詢後加'~數字'表示此短語中各單詞不一定相鄰,各單詞之間間隔距離總和不超過此數字。(距離按字計算,一個漢字和英文字母都算1個字)

例如,對于查詢'"A B C"~10',原文中出現'A B X C','A X B X C'都滿足條件。

再如:

假設臨近查詢條件為:"abcdefg"~4,并假設ab是一個詞,ef是一個詞,其它都是單字詞。臨近查詢的含義是:文章中包含ab c d ef g這五個詞,并且是按這樣的先後順序,并且這五個詞之間最多可以包含4個字的其它的字元。

例如:abMcdefg, abMcNdefg,abMcNdPefQg都是滿足條件的。(M、N、P、Q都是單字) aMbcdefg是不滿足條件的,因為這個串裡沒有ab這個詞。

<b>3.2 指定分隔的臨近查詢</b><b></b>

臨近查詢中可指定分隔點(用**表示),而不按照分詞的結果進行分隔,如查詢'abc'和'defg'相鄰,可指定查詢條件為 'abc**defg' , 表示查詢到'abc' 和 'defg' ,并且相鄰的距離不超過10個。這種查詢不能指定分隔距離,固定為10。

<b>4 模糊查詢</b><b></b>

單詞後加'~'查詢與此單詞拼寫相近的單詞。

隻要一個串跟檢索串的編輯距離小于這兩者中短串長度的一半,就算比對。

編輯距離是指:兩個字元串(以utf16表示)之間,由一個轉成另一個所需的最少操作次數,許可的操作包括插入一個字元、删除一個字元、改變一個字元。

例如,'computer~'可查到'computer'和'compute'。'international~'可查到'

'international'和'internationale'。

<b>5 </b><b>通配符查詢</b><b></b>

單詞中'*'比對一個或多個字元,'?'比對一個字元。隻有字元串類型支援通配符檢索。

注意:通配符如果用于第一個字元(如'*ed'),是相當耗時的。

<b>6 範圍查詢</b><b></b>

對數字和日期類型可進行範圍查詢。文法為

{'['|'{'}下限,上限{']'|'}'}

[/]表示包含邊界元素,{/}表示不包含邊界元素。

[-1,1] -&gt; -1,0,1

{-1,1} -&gt; 0

{-1,1] -&gt; 0,1

[-1,1} -&gt; -1,0

null表示最小/最大的元素。

[null,null] -&gt; 任何日期/數字

[null,1.0}  -&gt; 小于1.0的數字

[20040101,null] -&gt; 2004年1月1日及以後的日期

隻有整型、浮點型、日期型的資料支援範圍檢索,其它不支援。閉區間用[],開區間用{}。

注意:範圍查詢不支援枚舉類型。

<b>7 指定索引域</b><b></b>

文法為:

索引域:查詢

date:[20050101,20060101}

注意:查詢同音詞時,域名後加'@Spell',同音詞後加'@Syn',上位詞加'@ Brd ',下位詞加' @Nrw '。如果需要對分詞字段作不切分檢索(即對這個字段作完全比對,建索引時需要設定這個字段的IndexWhole屬性),在域名後加'@NoSplit'。域名@SplitAnd: 域值 表示将域值分詞後,再進行and查詢。域名@SplitOr: 域值 表示将域值分詞後,再進行or查詢。

<b>8 括号</b><b></b>

可以用括号組合查詢。

date:([20040101,20050101] or 20060101)

<b>9 指定權重</b><b></b>

在查詢項之後用'^數字'指定權重。

A^4 B

表示在對查詢結果排序中,A的影響力是B的4倍。

<b>10 日期型文法</b><b></b>

日期型檢索文法的表示為:YYYYMMDDhhmmss

例如查詢日期為2008年1月1日的文法是(假設日期型資料對應的域名是date)

date:20080101

查詢日期為2006年12月12日9點59分的文法是date:200612120959

<b>11 </b><b>G</b><b>roup by查詢文法</b><b></b>

Select f1, count(*), count(distinct f2) from index_lib where f3:value group by f1

其中,聚合函數必須是count,count裡可以是某個字段名或是*,用于統計每個分組的記錄數(不去除重複記錄);也可以是distinct加字段名,用以統計每一分組中這個字段的域值的出現次數。

<b>12 Classify by查詢文法</b><b></b>

Select f1 from index_lib where f3:value classify by f1

classify by 的域f1必須包含SameContent屬性,可将相識的文檔合并,所有的相似文檔隻作為一條結果傳回。

<b>13 Merge by查詢文法</b><b></b>

Select f1 from index_lib where f3:value merge by f1

merge by 的域f1必須為整型,可将具有相同值的文檔合并,所有相同值的文檔隻作為一條結果傳回,同時傳回相同值在索引庫中的數量。

<b>三 跨庫檢索文法</b><b></b>

select f11, f21 from lib1 where f31:value union select f12, f22 from lib2 where f32:value order by f11, f21  (說明:不同庫中域名不同,或者對不同庫的where檢索條件各不相同,使用此Union文法)

select f1, f2 from lib1,lib2 where f3:value (說明:域名完全相同,檢索條件完全一緻的庫可使用此簡化文法)

每個子句select部分的域個數必須相同。整個語句的order by部分出現的域名必須在第一個子句中,按這個字段在select語句中對應位置的字段的域值來排序,是以排序時對應位置的字段類型必須相同。

例如select f11, f21 from lib1 union select f12, f22 from lib2 order by f11,用lib1中的f11和lib2中的f12來排序,f11和f12的類型必須相同,f21和f22的類型不必完全相同。