<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 可以用 '&' 或空格代替,or 可以用 '|' 代替, not 可以用 '!' 代替。
域名@Spell: 域值 表示拼音查詢,域值應為漢字,不是拼音。
域名@Syn: 域值 表示同義查詢,查詢所有和域值同義的詞。
域名@SplitAnd: 域值 表示将域值分詞後,再進行and查詢。
域名@SplitOr: 域值 表示将域值分詞後,再進行or查詢。
<b>二 詳細文法</b><b></b>
<b>1 轉義字元</b><b></b>
\ + - ! ( ) : ^ [ ] { } " ~ * ? | &
這些符号在查詢文法中有特殊意義,如果要查詢符号本身,需要在前面加'\'。
注意:雙引号内除'"'和'\'外不用轉義。如'"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] -> -1,0,1
{-1,1} -> 0
{-1,1] -> 0,1
[-1,1} -> -1,0
null表示最小/最大的元素。
[null,null] -> 任何日期/數字
[null,1.0} -> 小于1.0的數字
[20040101,null] -> 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的類型不必完全相同。