英文地址:http://xapian.org/docs/queryparser.html

Xapian::QueryParser的语法

本文档介绍了Xapian::QueryParser类支持的查询语法.这套语法设计得跟其他基于Web的搜索引擎的语法类似,这样用户就会很熟悉,不用从头学习一个全新的语法。

操作符

AND

Expression AND expression 匹配两个条件都符合的文档.

OR

Expression AND expression 匹配符合两个条件中任何一个的文档.

NOT

expression NOT expression 匹配那些只匹配第一个条件的文档.这个也可以写成expression AND NOT expression.如果您设置了FLAG_PURE_NOT,那么 NOT expression 就匹配了所有不符合这个表达式的文档

XOR

expression XOR expression 匹配那些符合两个条件中的一个的文档;但是不能两个都符合.XOR可能有点不好理解。

带括号的表达式

你可以括号来调整布尔运算符的优先级.在one OR two AND three这个查询中,AND优先,这跟one OR (two AND three)是一样的.你可以用(one OR two) AND three来改变优先级 。

+和 -

一组带+和-符号的term,会匹配所有带+的term,但是不匹配带-的term。而不带有+或-的term则影响搜索结果中文档的排名.你也可以给短语和括号表达式加上+或-符号

NEAR

one NEAR two NEAR three匹配那些各个term间的距离在10以内的文档.你也可以通过NEAR/n这种方法把默认的10这个值设置为其他的值,如one NEAR/6 two.

ADJ

ADJ像NEAR ,但只匹配的文字以相同的顺序出现的文档。因此, one ADJ two ADJ three匹配那些包含了这几个term词并且term间的距离在10以内的文档.您也可以通过_ADJ/n_语法来修改这个默认的阈值,例如:one ADJ/6 two.

短语搜索

用一对由双引号包起来的短语来搜索时,结果是精确匹配 这个短语的文档.带连字符的语语也作为短语处理,像邮箱和文件名称等 (比如. /etc/passwd 或是 president@whitehouse.gov).

搜索相关的域

如果数据库索引时已经为一些域设置了前缀,你可以设置一个域-前缀的Map,这样用户可以搜定搜索某些特定字段。例如author:dickens title:shop就可以搜索作者是狄更斯,名字包含”shop”的书。您也可以为双引号括起来一个短语指定前缀,例如(author:”charles dickens” ),或是为括号内的表达式指定前缀:(例如title:(mice men) )。

搜索固有名词

如何你搜一个首字母大写的词,它搜索时将不做词干原.

区间搜索

The QueryParser can be configured to support range-searching using document values. 这种范围搜索的语法是_start_ .. end -例如, 01/03/2007..04/04/2007 , $10..100 , 5..10kg 。

同义词

QueryParser可以配置来支持同义词,它可以明确指定(使用语法~ term )或隐式(为所有term使用同义司,或是某些特别指出的一组term)。

通配符

QueryParser支持在结尾使用一个’*‘通配符的操作,wildc*将匹配wildcard, wildcarded, wildcards, wildcat, wildcats, etc等.此功能默认禁用. 在调用Xapian::QueryParser::parse_query( query_stringflags )函数时通过传递Xapian::QueryParser::FLAG_WILDCARD给flags参数就可以启用它.使用QueryParser::set_database( database )来告诉QueryParser用哪个数据库来扩展通配符.

query 片断的匹配

查询分析器(Query Parser)支持搜索只输入了片断的查询.计划实现的是这样一种”增量搜索”的系统,这种系统里,不等用户输完查询条件就可以显示一些查询结果.例如,在一个系统中,用户每输入一个字符,系统就输出新的搜索结果(也可能是另一种情况,如用户每停顿一小会就输出新的搜索结果,或其他情况).这种搜索有一个毛病就是,通过搜查询条件的一个片断,得到的结果跟实际想要的可能完全没有语义上的联系.比如,想搜dynamic cat,可能返回的是dynamic categorisation的结果.这种情况下每输入一个字符搜索结果 都会快速地变化.如果将输入部分的视为包含一个隐含的尾部通配符,它会匹配所有以已输入字符结开头的词,这样我们可以得到更平滑变动的搜索结果—-每当新字符键入时,搜索结果都会更接近我们想要的主题. 一个简单有效的办法就是开启通配符选荐,并在查询字符串的尾部加上”*“字符串. 不过这会跟那些以标点结束或其他一些字符结束的的搜索搅不清.此功能默认情况下是禁用. Xapian::QueryParser::parse_query( query_stringflags )函数时通过传递Xapian::QueryParser::FLAG_PARTIAL给flags参数就可以启用它.使用QueryParser::set_database( database )来告诉QueryParser用哪个数据库来扩展通配符.