一 语法概要
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查询。
二 详细语法
1 转义字符
\ + - ! ( ) : ^ [ ] { } " ~ * ? | &
这些符号在查询语法中有特殊意义,如果要查询符号本身,需要在前面加'\'。
注意:双引号内除'"'和'\'外不用转义。如'"c:\\dir"'而不是'"c\:\\dir"'。
例如:
查询'*'可输入'\*'。
查找路径为'c:\dir\1.txt'的文件可输入'FounderFTSKey:c\:\\dir\\1.txt'。
(更方便的方式是'FounderFTSKey:"c:\\dir\\1.txt"')。
查询'int_field:-1'可输入'int_field:\-1'。
2 布尔查询
2.1 连接符:
'A B' 或 'A and B' : A和B必须都出现。
'A or B' : A或B出现。
and优先级高于or。
2.2 修饰符
修饰符优先级高于连接符。
'!A' 'not A' : A不能出现。如'not A and B'(相当于(not A) and B)。
3 短语查询
引号内的内容在源文件中必须是连续的短语。如'A B C'查询所有包含单词A,B,C
的文件,而'"ABC"'查询所有包含短语"ABC"的文件。
注意:引号内可以有引号("),需要用转义符(\)转义。如引号内的'\\'表示'\'。
3.1 临近查询
短语查询后加'~数字'表示此短语中各单词不一定相邻,各单词之间间隔距离总和不超过此数字。(距离按字计算,一个汉字和英文字母都算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这个词。
3.2 指定分隔的临近查询
临近查询中可指定分隔点(用**表示),而不按照分词的结果进行分隔,如查询'abc'和'defg'相邻,可指定查询条件为 'abc**defg' , 表示查询到'abc' 和 'defg' ,并且相邻的距离不超过10个。这种查询不能指定分隔距离,固定为10。
4 模糊查询
单词后加'~'查询与此单词拼写相近的单词。
只要一个串跟检索串的编辑距离小于这两者中短串长度的一半,就算匹配。
编辑距离是指:两个字符串(以utf16表示)之间,由一个转成另一个所需的最少操作次数,许可的操作包括插入一个字符、删除一个字符、改变一个字符。
例如,'computer~'可查到'computer'和'compute'。'international~'可查到'
'international'和'internationale'。
5 通配符查询
单词中'*'匹配一个或多个字符,'?'匹配一个字符。只有字符串类型支持通配符检索。
注意:通配符如果用于第一个字符(如'*ed'),是相当耗时的。
6 范围查询
对数字和日期类型可进行范围查询。语法为
{'['|'{'}下限,上限{']'|'}'}
[/]表示包含边界元素,{/}表示不包含边界元素。
例如:
[-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日及以后的日期
只有整型、浮点型、日期型的数据支持范围检索,其它不支持。闭区间用[],开区间用{}。
注意:范围查询不支持枚举类型。
7 指定索引域
语法为:
索引域:查询
例如:
date:[20050101,20060101}
注意:查询同音词时,域名后加'@Spell',同音词后加'@Syn',上位词加'@ Brd ',下位词加' @Nrw '。如果需要对分词字段作不切分检索(即对这个字段作完全匹配,建索引时需要设置这个字段的IndexWhole属性),在域名后加'@NoSplit'。域名@SplitAnd: 域值 表示将域值分词后,再进行and查询。域名@SplitOr: 域值 表示将域值分词后,再进行or查询。
8 括号
可以用括号组合查询。
例如:
date:([20040101,20050101] or 20060101)
9 指定权重
在查询项之后用'^数字'指定权重。
例如:
A^4 B
表示在对查询结果排序中,A的影响力是B的4倍。
10 日期型语法
日期型检索语法的表示为:YYYYMMDDhhmmss
例如查询日期为2008年1月1日的语法是(假设日期型数据对应的域名是date)
date:20080101
查询日期为2006年12月12日9点59分的语法是date:200612120959
11 Group by查询语法
Select f1, count(*), count(distinct f2) from index_lib where f3:value group by f1
其中,聚合函数必须是count,count里可以是某个字段名或是*,用于统计每个分组的记录数(不去除重复记录);也可以是distinct加字段名,用以统计每一分组中这个字段的域值的出现次数。
12 Classify by查询语法
Select f1 from index_lib where f3:value classify by f1
classify by 的域f1必须包含SameContent属性,可将相识的文档合并,所有的相似文档只作为一条结果返回。
13 Merge by查询语法
Select f1 from index_lib where f3:value merge by f1
merge by 的域f1必须为整型,可将具有相同值的文档合并,所有相同值的文档只作为一条结果返回,同时返回相同值在索引库中的数量。
三 跨库检索语法
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的类型不必完全相同。