SQlite源码分析

fts3_expr.c简介doc

      而fts3_expr.c这个文件主要是实现查询字符串功能(MATCH函数)。MATCH运算符用在全文检索中。例如这两句:

SELECT title, body FROM pages WHERE pages MATCH 'world';
SELECT title, body FROM pages WHERE title MATCH 'world';

      这两句,前一个 MATCH 左边写了表名,后一个写的是列名。后一个仅搜索title列,前一个是搜索全部列(docid 列以外)。       MATCH右侧的表达式支持模糊查询、支持指定列查询、支持 AND/OR/NEAR/NOT 等运算,例如:

SELECT title, body FROM pages WHERE pages MATCH 'hel*';
SELECT title, body FROM pages WHERE pages MATCH 'title:hello';
SELECT title, body FROM pages WHERE pages MATCH 'hello AND world';
SELECT title, body FROM pages WHERE pages MATCH '(hello NEAR world) OR (program AND language)';

      但要注意只能出现一次 MATCH 判断,

WHERE title MATCH 'hello' AND body MATCH 'world';

是不行的,可以改作

WHERE pages MATCH 'title:hello AND body:world';

      本模块主要定义了以下几个函数:

函数名

函数功能

fts3isspace(char c)

检查参数c是否为空格字符

fts3MallocZero(int nByte)

分配内存字节

sqlite3Fts3OpenTokenizer

 

打开分词器

getNextToken

提取下一个标记和其他语法分析的信息

fts3ReallocOrFree

扩大内存分配

getNextString

处理整个缓冲输入和创建包含结果的类型为FTSQUERY_PHRASEFts3Expr结构体

fts3ExprParse

被函数fts3ExprParse()所引用

getNextNode

查找关键词

opPrecedence

返回一个代表操作优先级的整数

insertBinaryOperator

把二元操作插入查询表达树

fts3ExprParse

解析fts3查询表达式

sqlite3Fts3ExprParse

解析一个查询表达式和创建一个表示已被查询的表达式的Fts3Expr结构体树

      总的来说,这个模块主要是用于处理和分析表达式,说明这个模块之前必须先声明,当SQLITE_ENABLE_FTS3_PARENTHESIS参数被定义时,此模块将使用新的语法:

    新的句法支持括号,旧的不支持。
    新的句法支持AND和NOT操作,旧的不支持。
    旧的句法支持"-"符号是否是合格的验证,而新的句法不支持(以NOT操作代替)。
    当使用旧的句法时,OR操作比隐含的AND有更大的优先级,用新句法时,不论是隐式 还是显式的,AND都比OR有更高的优先级。