查询¶
这部分对SF1支持的查询模式进行简单的介绍,相应的API接口参看 搜索API
布尔查询¶
布尔查询基于倒排索引:给定查询,SF1首先会针对该查询进行分词处理,在AND查询方式下,所有分词之间 是逻辑”与”关系,意味着返回包含所有分词结果的文档;而OR查询方式下,分词之间是逻辑“或”关系,意味着 只要有一个词命中,该文档既可能返回。
SF1支持通用的布尔查询方式(AND,OR).AND相对于OR,有更快的查询速度和更好的查询结果, OR则能够返回更多的查询结果。因此,默认情况下采用AND查询。
下面给出使用AND模式的实例:
{
"collection":"b5mp",
"search":
{
"keywords":"she star",
"searching_mode":
{
"mode":"and"
}
}
}
Note
SF1缺省的查询方式为AND,如下请求使用AND模式查询
{
"collection":"b5mp",
"search":
{
"keywords":"你好 世界",
}
}
WAND查询¶
AND或OR的查询方式,由于其定义,主要缺陷在于完全匹配会导致太多或者太少的结果文档被返回。 WAND是Weak(Weighted) AND的缩写,是一种新型的布尔查询方式,同样基于倒排索引,通过对 每个查询关键赋予一定权重的方式,以期弥补AND或OR查询的缺陷。可以通过权重以及参数的调整, 使WAND查询返回合适的结果,而AND与OR查询则是WAND查询的上界与下界。其查询效率和查询质量 介于AND 与 OR之间。
下面给出使用WAND模式查询的实例:
{
"collection":"b5mp",
"search":
{
"keywords":"she star",
"searching_mode":
{
"mode":"wand"
"threshold":"0.35"
}
}
}
Note
WAND查询可以指定threshold属性。threshold越接近1,WAND表现得越像AND
Suffix查询¶
Suffix查询完全不同于以上查询,因为前者基于倒排索引进行,而Suffix查询基于最新型的 简洁数据结构(Succinct Index),其基本原理是,对文档数据构建压缩后缀数组,因此在索引 的时候是不存在分词的,这意味着可以针对任意子串进行查询。
对于使用Fuzzy查询时各个参数意义解释如下:
- lucky(Uint类型):指定该次检索的top k的值。这里之所以命名为lucky,是因为出于 效率的考虑,此处并不是完全精确的top k,而是有一定程度的近似。
- use_fuzzy(Bool类型):当指定该值为true时,将进行类似上述的WAND查询,所不同的是, 该查询是在后缀数组上进行,而非倒排表结构。 返回结果是对查询里所有分词结果取并的Top K,K 的大小既为lucky; 当指定该值为false时,搜索结果仅仅返回本次查询的最长后缀 (The search result only contain the longest suffix of query)。
下面给出使用该模式的Request例子:
{
"collection":"b5mp",
"search":
{
"keywords":"SHE奇幻旅程",
"searching_mode":
{
"mode":"suffix",
"lucky":"100",
"use_fuzzy":true
}
}
}
相应Response请求如下:
{
"header":
{
"success":true
},
"resources":
[
{
"Attribute":"",
"Brand":"",
"BuyCount":"",
"Category":"音乐/影视/明星/音像>音乐CD/DVD"
"Combined":"",
"CommentCount":"",
"Content":"",
"DATE":"20130121T004157",
"DOCID":"d7dadb40f63c2ecde6e2959db753c54e",
"Fenxiang":"",
"Guanzhu":"",
"OldOfferIds":"",
"OriginalCategory":"歌曲>其他流行音乐",
"OriginalPicture":"",
"PicPrpt":"",
"Picture":"http://img.b5m.com/image/T1WOhTBQEg1RCvBVdK/",
"Price":"16.00",
"Score":"",
"Source":"230",
"SubSource":"",
"TargetCategory":"图书音像>音像>音乐",
"Title":"SHE奇幻旅程",
"Url":"http://detail.bookuu.com/0607145.html",
"Xihuan":"",
"_id":4631779,
"_rank":10.45418739318848,
"itemcount":"1",
"mobile":""
},
...
{
"Attribute":"",
"Brand":"",
"BuyCount":"",
"Category":"钟表首饰>发饰",
"Combined":"",
"CommentCount":"",
"Content":"",
"DATE":"20130202T074337",
"DOCID":"7081fba55cf6b50a507044d0322f08fc",
"Fenxiang":"",
"Guanzhu":"",
"OldOfferIds":"",
"OriginalCategory":"饰品/流行首饰/时尚饰品新>发饰",
"OriginalPicture":"",
"PicPrpt":"",
"Picture":"http://img.b5m.com/image/T1rMVTBm_T1RCvBVdK/",
"Price":"136.00",
"Score":"",
"Source":"403",
"SubSource":"shes饰品旗舰店@天猫商城",
"TargetCategory":"珠宝饰品>时尚饰品>头饰",
"Title":"she's茜子正品 茜子头箍 浪漫田园印花手工布艺包边带齿发箍发卡",
"Url":"http://detail.tmall.com/item.htm?id=19695804534",
"Xihuan":"",
"_id":6836768,
"_rank":0.4242057502269745,
"itemcount":"1",
"mobile":""
}
],
"top_k_count":100,
"total_count":18154
}
为了说明use_fuzzy字段的作用,下面给出省略use_fuzzy字段的插叙的response:
{
"header":
{
"success":true
},
"resources":
[
{
"Attribute":"",
"Brand":"",
"BuyCount":"",
"Category":"音乐/影视/明星/音像>音乐CD/DVD"
"Combined":"",
"CommentCount":"",
"Content":"",
"DATE":"20130121T004157",
"DOCID":"d7dadb40f63c2ecde6e2959db753c54e",
"Fenxiang":"",
"Guanzhu":"",
"OldOfferIds":"",
"OriginalCategory":"歌曲>其他流行音乐",
"OriginalPicture":"",
"PicPrpt":"",
"Picture":"http://img.b5m.com/image/T1WOhTBQEg1RCvBVdK/",
"Price":"16.00",
"Score":"",
"Source":"230",
"SubSource":"",
"TargetCategory":"图书音像>音像>音乐",
"Title":"SHE奇幻旅程",
"Url":"http://detail.bookuu.com/0607145.html",
"Xihuan":"",
"_id":4631779,
"_rank":10.45418739318848,
"itemcount":"1",
"mobile":""
},
"top_k_count":1,
"total_count":2
}
该Response与默认搜索模式的Response一致。
Note
何时使用布尔查询,WAND查询,Suffix查询,取决于业务需求。 一般情况下,基于倒排表的查询(包括布尔查询,WAND查询)适合需要精确分页,性能要求不很高的场景,而Suffix查询适合于极高并发场景(在默认情况下,Suffix查询性能是布尔查询的十倍以上)。然而,Suffix查询存在一定程度的近似,并且只适合于针对相关度的查询。换句话,如果期望根据多字段排序,并且需要输出所有的结果,那么就不适合采用Suffix查询,而且即便采用了,那么也只能在返回结果的Top K里边进行要求的排序,而无法在所有结果里排序。
数据库风格查询¶
当查询Request的”keywords”字段为”*”时,该查询既为数据库风格查询。
对于该类查询模式,一般需要指定查询条件,否则查询结果将毫无意义。 查询条件的格式以及参数意义请参看 搜索API 中对condition参数的介绍。
下面给出使用该类查询模式的Request实例:
{
"collection":"b5mp",
"search":
{
"keywords":"*"
},
"conditions":
[
{
"property":"Price",
"operator":">",
"value":
[
100
]
}
]
}
对于该请求,将返回所有Price大于100的文档。