全文检索4.5查询语法

 

语法概要

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 , ornot  ( ) 组成布尔查询。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的类型不必完全相同。

上一篇:零示例学习中的映射域迁移 (projection domain shift) 问题


下一篇:OnItemCommand属性使用方法