查询

这部分对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的文档。