自定义查询
除了标准查询外,搜索平台还定义了扩展查询条件。
- 关键词高亮
- Fields查询(查询指定字段)
- Script Fields查询(动态脚本字段查询)
- terms查询
- bterms查询
- size_terms查询
- ids查询
- range查询
- match查询
- multi_match查询
- ematch查询
- query_string查询
- more_like_this查询
- prefix查询
- regexp查询
- wildcard查询
- span_first查询
- span_near查询
- stock查询(库存查询)
- nested查询
- null查询
- not查询
- geo_distance过滤
- geo_distance_range过滤
- geo_bounding_box过滤
1. 关键词高亮
关键词高亮主要是高亮搜索关键词,方便用户查找被检索的内容,突出显示结果的准确性,提供更好的用户体验。无论是Google、百度等综合搜索还是天猫、京东商品搜索都提供了类似的功能。
查询条件格式
ex_highlight_属性名=highlight(pre_tags:<red>,post_tags:</red>,q:苹果,multi_field:title.standard)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 需要高亮的字段名称,返回的数据结构中该字段会高亮显示关键词 |
pre_tags | string | 选填 | 高亮词起始标签,默认值为"<hl> " |
post_tags | string | 选填 | 高亮词结束标签,默认值为"</hl> " |
q | string | 选填 | 需要高亮的关键词,一般不填,默认为查询关键词 |
multi_field | string | 选填 | 针对一个属性对应搜索平台多个字段,搜索平台无法自动匹配,这时需要手工选择一个字段。目前商品标题就是这种情况,如果是标题高亮的话需要将该字段设为"title.standard" |
返回结果
返回结果中高亮的属性值会用指定的高亮标签包裹。
下面的例子表示搜索关键词为"苹果"的商品,并对商品标题(title字段)进行关键词高亮显示,高亮的开始标签为<red>
,结束标签为</red>
{
"total": 50,
"root": [
{
"spuId": "152749",
"adminId": "A967550",
"title": "<red>苹</red><red>果</red>(Apple)iPhone 6 Plus (A1524) 64GB 银色 4G手机 全网通 64GB 银色",
........
},
{
"spuId": "152752",
"adminId": "A967550",
"title": "<red>苹</red><red>果</red>(Apple)iPhone 6 Plus (A1524) 64GB 深空灰色 4G手机 全网通 64GB 灰色",
........
},
{
"spuId": "p84077",
"adminId": "A967550",
"title": "旺仔 qq糖青<red>苹</red><red>果</red>味 23g/袋【D】 <red>苹</red><red>果</red>味",
........
},
{
"spuId": "p86385",
"adminId": "A967550",
"title": "<red>苹</red><red>果</red> Apple MacBook Air 11.6英寸128GB闪存宽屏笔记本电脑 MJVM2CH/A 银色",
........
},
{
"spuId": "p65384",
"adminId": "A967550",
"title": "iPad mini3 WiFi版 MGGT2CH/A 64GB 银色",
........
},
{
"spuId": "418884",
"adminId": "A967550",
"title": "美丽的<red>苹</red><red>果</red>红色",
........
},
{
"spuId": "137854",
"adminId": "A967550",
"title": "康师傅 冰红茶青<red>苹</red><red>果</red>味 500ml*15/箱 青<red>苹</red><red>果</red>",
........
},
{
"spuId": "260494",
"adminId": "A967550",
"title": "海天 <red>苹</red><red>果</red>醋 450ml/瓶",
........
},
{
"spuId": "p74627",
"adminId": "A967550",
"title": "汇源 10%<red>果</red>汁<red>果</red>乐橙汁+<red>苹</red><red>果</red> 500ml*15/箱 其它",
........
},
{
"spuId": "393523",
"adminId": "A967550",
"title": "农夫<red>果</red>园 30%混合<red>果</red>蔬(橙+胡萝卜+<red>苹</red><red>果</red>) 1L*12/箱",
........
}
]
}
2. Fields查询(查询指定字段)
搜索平台默认查询会返回整个数据结构,但是很多场景下只需要几个字段,只查询必要字段可以提升查询效率,减少网络IO,而IO通常是比较低效的。
查询条件格式
ex_fields=属性1,属性2,属性3,....
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 需要查询的属性,支持多个属性,属性之间用","分隔。只会返回文档中实际存在的字段,即字段如果有错误或者不存在,可以正常返回。 |
返回结果
- 返回结果中字段的顺序和请求参数中的顺序是一致的。
- 如果有字段指定了高亮,则返回的字段值同样也会高亮。
下面的例子表示搜索关键词为"苹果"的商品,只查询商品中的spuId,skuId,salePrice,title四个属性,可以看到返回的字段顺序和请求参数保持一致:
http://192.168.65.222:18082/products/A967550?q=苹果&ex_fields=spuId,skuId,salePrice,title
{
"total": 50,
"root": [
{
"spuId": "152749",
"skuId": "g406875",
"salePrice": 6332,
"title": "苹果(Apple)iPhone 6 Plus (A1524) 64GB 银色 4G手机 全网通 64GB 银色"
},
{
"spuId": "152752",
"skuId": "g406879",
"salePrice": 6332,
"title": "苹果(Apple)iPhone 6 Plus (A1524) 64GB 深空灰色 4G手机 全网通 64GB 灰色"
},
{
"spuId": "p84077",
"skuId": "g371793",
"salePrice": 0.8,
"title": "旺仔 qq糖青苹果味 23g/袋【D】 苹果味"
},
{
"spuId": "p86385",
"skuId": "g382528",
"salePrice": 5888,
"title": "苹果 Apple MacBook Air 11.6英寸128GB闪存宽屏笔记本电脑 MJVM2CH/A 银色"
},
{
"spuId": "p65384",
"skuId": "g104434",
"salePrice": 3500.0,
"title": "iPad mini3 WiFi版 MGGT2CH/A 64GB 银色"
},
{
"spuId": "418884",
"skuId": "g819706",
"salePrice": 5,
"title": "美丽的苹果红色"
},
{
"spuId": "137854",
"skuId": "g407313",
"salePrice": 35,
"title": "康师傅 冰红茶青苹果味 500ml*15/箱 青苹果"
},
{
"spuId": "260494",
"skuId": "g566837",
"salePrice": 6.2,
"title": "海天 苹果醋 450ml/瓶"
},
{
"spuId": "p74627",
"skuId": "g381037",
"salePrice": 32,
"title": "汇源 10%果汁果乐橙汁+苹果 500ml*15/箱 其它"
},
{
"spuId": "393523",
"skuId": "g773658",
"salePrice": 75,
"title": "农夫果园 30%混合果蔬(橙+胡萝卜+苹果) 1L*12/箱"
}
]
}
3. Script Fields查询(动态脚本字段查询)
Fields查询只能查询文档中的固定字段,不支持对字段进行脚本运算。假设我们有如下定义:商品的利润=商品的销售价-商品的成本价,现在需要查询商品的利润,就可以通过动态脚本字段实现,我们定义一个动态字段利润字段(profit),则使用如下动态脚本字段查询即可:ex_script_field_profit=doc.salePrice.value-doc.costPrice.value。
同一个查询中动态脚本字段可以定义多个,ex_script_field_A1=...&ex_script_field_A2=...
动态脚本字段和固定字段查询条件可以同时存在,即ex_fields=B1,B2... & ex_script_field_A1=....
查询条件格式
ex_script_field_动态属性名=doc.salePrice.value*2
ex_script_field_动态属性名=pow(doc.salePrice.value,2)
ex_script_field_动态属性名=doc.salePrice.value-doc.costPrice.value
ex_script_field_动态属性名=doc[salePrice].value-doc[costPrice].value
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 动态属性,返回的值就放在这个属性中 |
动态脚本 | string | 必填 | doc表示整个文档,可以通过doc.salePrice或者doc[salePrice]的方式访问文档salePrice属性,属性.value表示属性的值 |
返回结果
下面的例子表示搜索关键词为"华为手机"的商品,只查询商品中的spuId,skuId,salePrice,title四个属性,并定义了"doublePrice"动态字段:
{
"total": 215,
"root": [
{
"spuId": "111586",
"skuId": "g349391",
"salePrice": 1699,
"doublePrice": 3398.0,
"title": "荣耀 6 (H60-L01) 低配版 16G 移动4G 黑色"
},
{
"spuId": "163870",
"skuId": "g423786",
"salePrice": 600,
"doublePrice": 1200.0,
"title": "CDMA<hl>华</hl><hl>为</hl> C8817E 8G 电信4G 黑色"
},
{
"spuId": "163912",
"skuId": "g423870",
"salePrice": 470,
"doublePrice": 940.0,
"title": "CDMA<hl>华</hl><hl>为</hl> C8817L 4G 电信3G 白色"
},
{
"spuId": "163923",
"skuId": "g423887",
"salePrice": 2085,
"doublePrice": 4170.0,
"title": "<hl>华</hl><hl>为</hl> 荣耀6Plus(移动4G) 16G 移动4G 白色"
},
………………..
}
4. terms查询
term表示词条,是搜索平台保存值的最小单位。terms查询主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed的字符串(未经分析的文本数据类型)。对于分词的string字段,对该字段进行term查询表示该字段分词后的词条必须要包含查询词条;对于不分词的字段,term查询可以简单理解为sql中的"="。
以商品为例,销售价格salePrice是数值类型,是不分词的,对该字段进行term 100查询,则销售价格为100的商品满足查询条件。
默认搜索平台对string类型的字段会索引为两个字段,原始字段不分词,".analyzed"字段采用千米标准分词进行分词。如果字段propA为string类型,propB类型为number类型,有个文档propA值为"华为手机",propB的值为15.5, 搜索平台形成的文档中propA会建立两个字段"propA"和"propA.analyzed",假设"华为手机"分词后的词条为"华为"和"手机",那么term查询结果如下:
字段名称 | term查询词条 | 文档是否满足查询条件 |
---|---|---|
propA | 华为 | 不符合 |
propA | 华为手机 | 符合 |
propA.analyzed | 华为 | 符合 |
propA.analyzed | 华为手机 | 不符合 |
propB | 15.5 | 符合 |
propB | 15.50 | 符合 |
propB | 15.51 | 不符合 |
查询条件格式
ex_q_属性名=terms(值1,值2,值3)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
值 | string | 必填 | 支持多个值,值之间用","分隔,多个值之间是or关系 |
返回结果
下面的例子对skuId字段进行terms查询:
http://192.168.65.222:18082/products/A967550?ex_q_skuId=terms(g781407,g642997)&
{
"total": 2,
"root": [
{
"spuId": "304044",
"adminId": "A967550",
"standardCateStatus": 0,
"title": "苏酒 苏酒一号46度 500ml/瓶",
"salePoint": "",
"addTime": "2015-12-09T13:26:45+0800",
"top": 0,
"stdProductId": "p20463060",
"standardParentCatePath": "",
"cats": [],
"costPrice": 89,
"type": "p20463060-1454493876704",
"stock": {
"status": true,
"name": "总量",
"stock": 0
},
"skuId": "g642997",
"tags": [],
"brand": "苏酒"
},
{
"spuId": "398182",
"adminId": "A967550",
"title": "郎酒 郎牌特曲T3精装42度 500ml/瓶",
"salePoint": "",
"addTime": "2016-03-04T11:23:53+0800",
"top": 0,
"stdProductId": "p20595978",
"standardParentCatePath": "",
"cats": [],
"costPrice": 58,
"type": "p20595978-1457061833132",
"stock": {
"status": true,
"name": "总量",
"stock": 0
},
"skuId": "g781407",
"tags": [],
"brand": "郎酒"
}
]
}
5. bterms查询
bterms查询表示bool terms查询,查询格式、查询结果和terms查询相同,所有使用terms查询的地方都可以用bterms替代。
Elasticsearch2.x版本不再支持terms查询,搜索平台内部使用bool查询实现了terms查询功能,并命名为bterms(bool terms)查询,后续建议使用bterms代替terms查询。
查询条件格式
ex_q_属性名=bterms(值1,值2,值3)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
值 | string | 必填 | 支持多个值,值之间用","分隔,多个值之间是or关系 |
返回结果
下面的例子对skuId字段进行bterms查询:
http://192.168.65.222:18082/products/A967550?ex_q_skuId=bterms(g781407,g642997)&
{
"total": 2,
"root": [
{
"spuId": "304044",
"adminId": "A967550",
"standardCateStatus": 0,
"title": "苏酒 苏酒一号46度 500ml/瓶",
"salePoint": "",
"addTime": "2015-12-09T13:26:45+0800",
"top": 0,
"stdProductId": "p20463060",
"standardParentCatePath": "",
"cats": [],
"costPrice": 89,
"type": "p20463060-1454493876704",
"stock": {
"status": true,
"name": "总量",
"stock": 0
},
"skuId": "g642997",
"tags": [],
"brand": "苏酒"
},
{
"spuId": "398182",
"adminId": "A967550",
"title": "郎酒 郎牌特曲T3精装42度 500ml/瓶",
"salePoint": "",
"addTime": "2016-03-04T11:23:53+0800",
"top": 0,
"stdProductId": "p20595978",
"standardParentCatePath": "",
"cats": [],
"costPrice": 58,
"type": "p20595978-1457061833132",
"stock": {
"status": true,
"name": "总量",
"stock": 0
},
"skuId": "g781407",
"tags": [],
"brand": "郎酒"
}
]
}
6. size_terms查询
对数组或者list字段来说,terms查询多个值之间是or关系,只要数组中的值满足一个查询值即满足查询请求。size_terms可以指定匹配值的个数,字段必须满足匹配数才算满足查询条件。
以商品为例:商品中的productLine(产品线)是array字段,值1:云商城,2:云订货,3:云小店,4:云供货,一个商品可以属于多个产品线。有如下商品:
商品 | productLine |
---|---|
商品1 | [1,2,3,4] |
商品2 | [1,2] |
商品3 | [1,3] |
商品4 | [2,3] |
进行如下查询:
查询类型 | 查询值 | 匹配结果 |
---|---|---|
terms | 2,3 | 商品1,商品2,商品3,商品4 |
size_terms | 2,3 | 商品1,商品4 |
size_terms | 1,2,3;size为2 | 商品1,商品2,商品3,商品4 |
查询条件格式
ex_q_属性名=size_terms(value:值1,值2,值3;size:0)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
值 | string | 必填 | 支持多个值,值之间用","分隔 |
size | int | 选填 | 匹配值的个数,不填或者填0表示所有的值全匹配 |
返回结果
下面的例子对商品productLine字段进行size_terms查询,查询同时属于云商场和云订货的商品:
http://192.168.65.222:18082/products/A967550?ex_q_productLine=size_terms(value:1,2)&
{
"total": 7508,
"root": [
...
]
}
7. ids查询
ids查询根据文档的ID进行查询,支持多个ID输入。
查询条件格式
ex_q_ids=ids(ID值1,ID值2,ID值3)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
值 | string | 必填 | 支持多个值,值之间用","分隔,多个值之间是or关系 |
返回结果
下面的例子对商品进行ids查询:
http://192.168.65.222:18082/products/A967550?ex_q_ids=ids(g781407,g642997)&
{
"total": 2,
"root": [
...
]
}
8. range查询
range查询根据指定的区间对文档进行查询,range查询只能作用于数值和日期字段,支持多个区间,多个区间之间是or关系。
区间采用左闭右开的原则。
比如查询商品销售价格在[200, 500)和[3000, ⑅)范围的商品就可以用range查询
查询条件格式
ex_q_属性名=range(-num:200,num:500-num:1200,num:3333-)
或者可以省略掉类型:
ex_q_属性名=range(-200,500-1200,3333-)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段,该字段必须是number或者date类型 |
范围 | string | 必填 | 支持多个区间,区间之间用","分隔,区间之间是or关系。区间左闭右开,格式为"num:5-num:20"、"-num:100" 、"num:500-","num"表示范围是数值类型,类型和值之间用":"分隔。也可以省略掉类型声明,"5-20"、"-100" 、"500-" |
返回结果
下面的例子查询商品销售价格在[200, 500)和[3000, ⑅)范围的商品:
{
"total": 289,
"root": [
{
"skuId": "g100744",
"salePrice": 355,
"title": "惠氏 启赋 婴儿配方奶粉1段900g罐装【D】"
},
{
"skuId": "g104434",
"salePrice": 3500.0,
"title": "iPad mini3 WiFi版 MGGT2CH/A 64GB 银色"
},
{
"skuId": "g10469",
"salePrice": 385,
"title": "惠普 Q2612A 硒鼓"
},
{
"skuId": "g10470",
"salePrice": 408,
"title": "惠普 CC388A 硒鼓"
},
{
"skuId": "g10524",
"salePrice": 310.0,
"title": "得力 9923 多功能碎纸机"
},
{
"skuId": "g107699",
"salePrice": 6199,
"title": "【预购商品,下单三天后配送】卡西欧(CASIO)EX-TR500 数码相机 单机版 (1110万像素 21mm广角 自拍神器)"
},
{
"skuId": "g107701",
"salePrice": 5999,
"title": "【预购商品,下单三天后配送】卡西欧(CASIO)EX-TR350S 自拍神器 特供版 黑色 (1210万像素 3.0英寸超高清LCD 21mm广角 自拍神器)"
},
{
"skuId": "g10904",
"salePrice": 229,
"title": "得力 8877 七层带锁文件柜"
},
{
"skuId": "g10906",
"salePrice": 230.0,
"title": "得力 9703 七层带锁文件柜"
},
{
"skuId": "g10874",
"salePrice": 220.0,
"title": "得力 0150 重型打孔机"
}
]
}
9. match查询
match查询是一个标准查询,无论是全文本查询还是精确查询都可以使用它。用match查询给定值,在遇到数字,日期,布尔值或者not_analyzed的字符串时,都返回和给定值相同的文档,等同于sql的"="。
如果使用match查询一个全文本字段,它会在真正查询之前用分析器先分析查询字符串,然后进行全文检索。
match查询和terms查询区别
- 对于非分词字段,match查询和terms查询都是精确匹配,效果是相同的。
- 对于分词字段,terms查询不支持,match可以进行全文检索
如果字段propA为string类型,propB类型为number类型,有个文档propA值为"华为手机",propB的值为15.5, 搜索平台形成的文档中propA会建立两个字段"propA"和"propA.analyzed",假设"华为手机"分词后的词条为"华为"和"手机",那么term查询结果如下:
字段名称 | 查询词条 | 文档是否满足terms查询条件 | 文档是否满足match查询条件 |
---|---|---|---|
propA | 华为 | 不符合 | 不符合 |
propA | 华为手机 | 符合 | 符合 |
propA.analyzed | 华为 | 符合 | 符合 |
propA.analyzed | 华为手机 | 不符合 | 符合 |
propB | 15.5 | 符合 | 符合 |
propB | 15.50 | 符合 | 符合 |
propB | 15.51 | 不符合 | 不符合 |
查询条件格式
ex_q_属性名=match(值)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
值 | string | 必填 | 要查询的值 |
返回结果
下面的例子对商品title.standard字段进行match查询:
{
"total": 2783,
"root": [
{
"skuId": "g567650",
"salePrice": 1.6,
"title": "恒顺 黄酒 350ml/袋"
},
{
"skuId": "g567668",
"salePrice": 1.5,
"title": "恒顺 料酒 350ml/袋"
},
{
"skuId": "g567676",
"salePrice": 1.4,
"title": "恒顺 葱姜料酒袋 350ml/袋"
},
{
"skuId": "g567659",
"salePrice": 3.5,
"title": "恒顺 黄酒 450ml/瓶"
},
{
"skuId": "g567673",
"salePrice": 3.5,
"title": "恒顺 料酒 450ml/瓶"
},
{
"skuId": "g567645",
"salePrice": 4,
"title": "恒顺 姜汁料酒 500ml/瓶"
},
{
"skuId": "g781076",
"salePrice": 52.8,
"title": "恒顺 葱姜料酒 480ml*12/箱"
},
{
"skuId": "g567631",
"salePrice": 4,
"title": "恒顺 红烧料酒 450ml/瓶"
},
{
"skuId": "g567637",
"salePrice": 4.4,
"title": "恒顺 葱姜料酒 480ml/瓶"
},
{
"skuId": "g567675",
"salePrice": 4.7,
"title": "恒顺 金标料酒 500ml/瓶"
}
]
}
10. multi_match查询
multi_match查询允许在match查询的基础上同时搜索多个字段,即将相同的match查询作用在多个字段上,可以指定多个字段之间的逻辑关系,如果关系为and,则要所有字段都匹配,如果关系为or,只要有一个字段符合即可
查询条件格式
ex_q_属性名1,属性名2,属性名3=multi_match(query:华为手机;type:most_fields;operator:and)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段,支持多个字段,字段之间用","分隔 |
query | string | 必填 | 要查询的值 |
type | string | 选填 | 多个字段的查询方式,可选值best_fields、most_fields、cross_fields、phrase和phrase_prefix:默认值为best_fields |
operator | string | 选填 | 字段匹配结果的逻辑计算方式,可选值:and、or;默认值or |
返回结果
下面的例子对商品title.standard、productName字段进行multi_match查询:
{
"total": 2783,
"root": [
{
"skuId": "g567650",
"salePrice": 1.6,
"title": "恒顺 黄酒 350ml/袋"
},
{
"skuId": "g567668",
"salePrice": 1.5,
"title": "恒顺 料酒 350ml/袋"
},
{
"skuId": "g567676",
"salePrice": 1.4,
"title": "恒顺 葱姜料酒袋 350ml/袋"
},
{
"skuId": "g567659",
"salePrice": 3.5,
"title": "恒顺 黄酒 450ml/瓶"
},
{
"skuId": "g567673",
"salePrice": 3.5,
"title": "恒顺 料酒 450ml/瓶"
},
{
"skuId": "g567645",
"salePrice": 4,
"title": "恒顺 姜汁料酒 500ml/瓶"
},
{
"skuId": "g781076",
"salePrice": 52.8,
"title": "恒顺 葱姜料酒 480ml*12/箱"
},
{
"skuId": "g567631",
"salePrice": 4,
"title": "恒顺 红烧料酒 450ml/瓶"
},
{
"skuId": "g567637",
"salePrice": 4.4,
"title": "恒顺 葱姜料酒 480ml/瓶"
},
{
"skuId": "g567675",
"salePrice": 4.7,
"title": "恒顺 金标料酒 500ml/瓶"
}
]
}
11. ematch查询
extend match(扩展match, ematch)允许在match查询的基础上设置查询值分词后的结果的逻辑关系。如果关系为and,则要所有词条都匹配,如果关系为or,只要有一个词条匹配即可
查询条件格式
ex_q_属性名=ematch(query:华为手机;minimum_should_match:2;operator:or)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段,支持多个字段,字段之间用","分隔 |
query | string | 必填 | 要查询的值 |
operator | string | 选填 | 词条匹配结果的逻辑计算方式,可选值:and、or;默认值or |
minimum_should_match | int | 选填 | 多个词条的匹配数目,当operator为or是生效,默认值为1 |
返回结果
下面的例子对商品title.standard字段进行ematch查询:
{
"total": 1,
"root": [
{
"skuId": "g567650",
"salePrice": 1.6,
"title": "恒顺 黄酒 350ml/袋"
}
]
}
12. query_string查询
query_string属于全文搜索查询方式,和match查询基本类似,但是query_string支持lucene表达式。一般建议使用match查询。
查询条件格式
ex_q_属性名=query_string(query:华为手机;minimum_should_match:2;default_operator:or;analyzer:qm_standard)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
query | string | 必填 | 要查询的值 |
default_operator | string | 选填 | 词条匹配结果的逻辑计算方式,可选值:and、or;默认值or |
minimum_should_match | int | 选填 | 多个词条的匹配数目,当operator为or是生效,默认值为1 |
analyzer | string | 选填 | 分词器,一般使用千米自定义分词器qm_standard |
返回结果
下面的例子对商品title.standard字段进行query_string查询:
{
"total": 2783,
"root": [
{
"skuId": "g567650",
"salePrice": 1.6,
"title": "恒顺 黄酒 350ml/袋"
},
{
"skuId": "g567668",
"salePrice": 1.5,
"title": "恒顺 料酒 350ml/袋"
},
{
"skuId": "g567676",
"salePrice": 1.4,
"title": "恒顺 葱姜料酒袋 350ml/袋"
},
{
"skuId": "g567659",
"salePrice": 3.5,
"title": "恒顺 黄酒 450ml/瓶"
},
{
"skuId": "g567673",
"salePrice": 3.5,
"title": "恒顺 料酒 450ml/瓶"
},
{
"skuId": "g567645",
"salePrice": 4,
"title": "恒顺 姜汁料酒 500ml/瓶"
},
{
"skuId": "g781076",
"salePrice": 52.8,
"title": "恒顺 葱姜料酒 480ml*12/箱"
},
{
"skuId": "g567675",
"salePrice": 4.7,
"title": "恒顺 金标料酒 500ml/瓶"
},
{
"skuId": "g567631",
"salePrice": 4,
"title": "恒顺 红烧料酒 450ml/瓶"
},
{
"skuId": "g567637",
"salePrice": 4.4,
"title": "恒顺 葱姜料酒 480ml/瓶"
}
]
}
13. more_like_this查询
more_like_this查询可以获取和所提供的文本相似的文档,可以通过具体的参数调整文本相似度。支持对多个字段进行查询。
查询条件格式
ex_q_属性名1,属性名2=more_like_this(like_text:华为手机;analyzer:qm_standard)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
like_text | string | 必填 | 文档要比较的内容 |
default_operator | string | 选填 | 词条匹配结果的逻辑计算方式,可选值:and、or;默认值or |
minimum_should_match | int | 选填 | 多个词条的匹配数目,当operator为or是生效,默认值为1 |
analyzer | string | 选填 | 分词器,一般使用千米自定义分词器qm_standard |
返回结果
下面的例子对商品title.standard字段进行more_like_this查询:
14. prefix查询
prefix查询(前缀查询)可以获取某个字段以给定的前缀开始的文档。例如,想查询所有titile字段以"苹果"开始的文档就可以使用prefix查询。
prefix查询的字段必须是没有分词的字段(not analyzed).
查询条件格式
ex_q_属性名=prefix(prefix:华为手机;boost:1.0;rewrite:constant_score_auto)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
prefix | string | 必填 | 文档字段要查询的前缀 |
boost | double | 选填 | 得分权重,可不填,默认为1.0 |
rewrite | string | 选填 | 查询重写属性,可选值:constant_score_auto、constant_score_boolean、constant_score_filter、scoring_boolean、top_terms_N、top_terms_boost_N,默认为 constant_score_auto |
返回结果
下面的例子查询title字段以"喜之郎"开头的所有商品
{
"total": 29,
"root": [
{
"skuId": "g604176",
"salePrice": 72.5,
"title": "喜之郎 优乐美杯装奶茶混合口味 80g*30/箱 混合口味"
},
{
"skuId": "g643805",
"salePrice": 2.4,
"title": "喜之郎 果冻爽苹果味 218g/杯"
},
{
"skuId": "g644563",
"salePrice": 2.4,
"title": "喜之郎 果冻爽苹果味 150g/包"
},
{
"skuId": "g644594",
"salePrice": 2.4,
"title": "喜之郎 果冻爽香橙味 150g/包"
},
{
"skuId": "g644600",
"salePrice": 2.5,
"title": "喜之郎 海苔原味 3g/包"
},
{
"skuId": "g643793",
"salePrice": 3.9,
"title": "喜之郎 果肉果冻什锦装 200g/杯"
},
{
"skuId": "g694962",
"salePrice": 2.5,
"title": "喜之郎 优乐美速溶奶茶红豆奶味 80g/杯"
},
{
"skuId": "g694971",
"salePrice": 2.5,
"title": "喜之郎 优乐美速溶奶茶原味 80g/杯"
},
{
"skuId": "g694966",
"salePrice": 2.5,
"title": "喜之郎 优乐美速溶奶茶巧克力味 80g/杯"
},
{
"skuId": "g604175",
"salePrice": 3.5,
"title": "喜之郎 优乐美速溶奶茶红豆奶味 65g/杯 红豆"
}
]
}
15. regexp查询
regexp查询(正则表达式查询)可以查询某个字段是否符合给定的正则表达式,正则表达式查询属于非常消耗资源的查询,原则上不允许业务使用。
查询条件格式
ex_q_属性名=regexp(value:.+手机;boost:1.0;flags:ALL;max_determinized_states:10000)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
value | string | 必填 | 要匹配的正则表达式 |
boost | double | 选填 | 得分权重,可不填,默认为1.0 |
flags | string | 选填 | 默认值为 ALL |
max_determinized_states | int | 选填 | 默认值为 10000 |
返回结果
下面的例子查询title字段以"喜开头红豆结尾"(正则表达式为"喜.+红豆")的所有商品
{
"total": 1,
"root": [
{
"skuId": "g604175",
"salePrice": 3.5,
"title": "喜之郎 优乐美速溶奶茶红豆奶味 65g/杯 红豆"
}
]
}
16. wildcard查询
wildcard查询(通配符查询)类似于terms查询,不过支持通配符"*"(任意字符)、"?"(单个字符)查询,语法和功能上类似于SQL中的like查询,部分wildcard查询属于非常消耗资源的查询,需要慎用。
查询条件格式
ex_q_属性名=wildcard(value:*手机;boost:1.0)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
value | string | 必填 | 要查询的值 |
boost | double | 选填 | 得分权重,可不填,默认为1.0 |
返回结果
下面的例子查询title字段以"喜"开头"红豆"结尾的所有商品
{
"total": 1,
"root": [
{
"skuId": "g604175",
"salePrice": 3.5,
"title": "喜之郎 优乐美速溶奶茶红豆奶味 65g/杯 红豆"
}
]
}
17. span_first查询
span_first查询属于跨度查询的一种。跨度查询主要是能够匹配一些词条或者短语位于其它词条或者短语附近的情况。如果使用非跨度查询,无法进行这种位置的感知。span_first查询只允许返回在字段的前几个位置上匹配查询条件的文档。比如我们可以使用span_first查询商品标题前五个位置上出现"苹果"的文档。
查询条件格式
ex_q_属性名=span_first(value:手机;end:5;boost:1.0)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
value | string | 必填 | 要查询的值 |
end | int | 必填 | 字段前几个词条参与匹配 |
boost | double | 选填 | 得分权重,可不填,默认为1.0 |
返回结果
下面的例子查询title字段前3个词条包含"苹果"的所有商品
{
"total": 7,
"root": [
{
"skuId": "g819706",
"salePrice": 5,
"title": "美丽的苹果红色"
},
{
"skuId": "g60670",
"salePrice": 32,
"title": "张裕 苹果起泡酒 1.5L/瓶"
},
{
"skuId": "g697487",
"salePrice": 5.8,
"title": "双宇 苹果果蔬脆片原味 35g/袋"
},
{
"skuId": "g406875",
"salePrice": 6332,
"title": "苹果(Apple)iPhone 6 Plus (A1524) 64GB 银色 4G手机 全网通 64GB 银色"
},
{
"skuId": "g406879",
"salePrice": 6332,
"title": "苹果(Apple)iPhone 6 Plus (A1524) 64GB 深空灰色 4G手机 全网通 64GB 灰色"
},
{
"skuId": "g382528",
"salePrice": 5888,
"title": "苹果 Apple MacBook Air 11.6英寸128GB闪存宽屏笔记本电脑 MJVM2CH/A 银色"
},
{
"skuId": "g416253",
"salePrice": 5530.0,
"title": "苹果(Apple)iPhone 6 Plus (A1524) 16GB 深空灰色 4G手机 其它 16GB 灰色"
}
]
}
将匹配位置调整为2,查询前两个词条包含"苹果"的商品,这时第三个词条位置是"苹果"的商品就被排除了:
{
"total": 5,
"root": [
{
"skuId": "g697487",
"salePrice": 5.8,
"title": "双宇 苹果果蔬脆片原味 35g/袋"
},
{
"skuId": "g382528",
"salePrice": 5888,
"title": "苹果 Apple MacBook Air 11.6英寸128GB闪存宽屏笔记本电脑 MJVM2CH/A 银色"
},
{
"skuId": "g406875",
"salePrice": 6332,
"title": "苹果(Apple)iPhone 6 Plus (A1524) 64GB 银色 4G手机 全网通 64GB 银色"
},
{
"skuId": "g406879",
"salePrice": 6332,
"title": "苹果(Apple)iPhone 6 Plus (A1524) 64GB 深空灰色 4G手机 全网通 64GB 灰色"
},
{
"skuId": "g416253",
"salePrice": 5530.0,
"title": "苹果(Apple)iPhone 6 Plus (A1524) 16GB 深空灰色 4G手机 其它 16GB 灰色"
}
]
}
18. span_near查询
span_near查询也属于跨度查询,可以在有多个其它跨度彼此接近时对文档进行检索,该查询也是一个能够将其它跨度查询包装起来的复合查询。比如我们可以使用span_near查询"手机"词条附近有"6s"词条的文档。
查询条件格式
ex_q_属性名=span_near(value:手机,6s;slot:1;boost:1.0)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
value | string | 必填 | 要查询的值 |
slot | int | 必填 | 跨度之间允许的其它词条数 |
boost | double | 选填 | 得分权重,可不填,默认为1.0 |
19. stock查询(库存查询)
stock库存查询主要是查询商品库存,支持区域库存和库存范围查询。
查询条件格式
ex_q_属性名=stock(range:-10,20-60,70-;region:nanjing,field:stock)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
range | string | 必填 | 要查询的库存区间,有货的话用"1-"即可 |
region | string | 选填 | 区域库存,如果不填的话表示全局库存 |
field | string | 选填 | 存放库存数目的字段名称,默认值为"stock" |
返回结果
查询全局库存数目大于等于1000的商品:
{
"total": 13,
"root": [
{
"skuId": "g10944",
"title": "得力 2050 美工刀 一把",
"salePrice": 0.99,
"stock.stock": 1042
},
{
"skuId": "g13956",
"title": "帕提尼斯(至尊版)A4 70g复印纸",
"salePrice": 17,
"stock.stock": 1088
},
{
"skuId": "g20501",
"title": "得力 9052 百事贴 1本",
"salePrice": 1.83,
"stock.stock": 1280
},
{
"skuId": "g23544",
"title": "得力 7122 强力固体胶 1只",
"salePrice": 1.93,
"stock.stock": 1351
},
{
"skuId": "g368186",
"title": "得力5534抽杆夹 白色 1只 白色",
"salePrice": 1.24,
"stock.stock": 1019
},
{
"skuId": "g336204",
"title": "得力 5594 B5网格拉链袋 1只 混色",
"salePrice": 3,
"stock.stock": 1326
},
{
"skuId": "g463832",
"title": "得力 6807 白板笔 1支 黑色",
"salePrice": 1.5,
"stock.stock": 1766
},
{
"skuId": "g592945",
"title": "得力 5588 A4磨砂文件袋 1个 混色 单只装",
"salePrice": 1.3,
"stock.stock": 2212
},
{
"skuId": "g604170",
"title": "得力 S656 宝珠笔(黑) 1支 黑色 单支装",
"salePrice": 1.04,
"stock.stock": 1635
},
{
"skuId": "g61324",
"title": "得力 6801 白板笔 黑色 1支",
"salePrice": 1.7,
"stock.stock": 2038
}
]
}
20. nested查询
nested查询用于对字段是嵌套类型的文档的查询。商品的类目是嵌套类型,要对类目进行查询就必须要用nested查询
查询条件格式
ex_q_属性名=nested(field:a|b;query:<嵌套实体子查询>)
查询参数
参数名 | 数据类型 | 可需 | 描述 | |
---|---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 | |
query | string | 必填 | 存放嵌套查询的实体子查询 | |
field | string | 必填 | 路径名,如果中间有多层路径则放在path中,用" | "分隔 |
返回结果
查询商品二级类目为"时尚饮品"的商品:
21. null查询
null查询用于查询字段是否为null。null查询属于filter,查询结果不会对得分和聚合产生影响。
根据user字段查询:
- 返回true的情况:{ "user": "jane" }、{ "user": "" }、 { "user": "-" } 、{ "user": ["jane"] } 、{ "user": ["jane", null ] }
- 返回false的情况:{ "user": null }、{ "user": [] }、 { "user": [null] }、 { "foo": "bar" }
查询条件格式
ex_q_属性名=null(flag:false)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
flag | bool | 选填 | 主要是决定是null还是not null, true表示是null查询;false表示not null查询。默认为false |
返回结果
查询商品规格字段(specs)为null的文档:
http://0.0.0.0:8009/products/A967550?ex_q_specs=null(flag:true)&
查询商品规格字段(specs)为不为null的文档:
22. not查询
not查询用于对查询取反。比如查询商品标题中不还有"苹果"时就可以对标题含有苹果的查询取反。
查询条件格式
ex_q_not=not(query:<子查询>)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
query | string | 必填 | 存放not查询的实体查询 |
返回结果
查询spuId字段不为"268118"的文档:
http://0.0.0.0:8009/products/A967550?ex_q_not=not(query:<ex_q_spuId=terms(268118)>)&
23. geo_distance过滤
geo_distance过滤针对地理坐标类型字段,可以查询距离指定坐标在指定范围内的文档。
查询条件格式
ex_f_属性名=geo_distance(location:120.11,44.3;distance:150km)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
location | string | 必填 | 地理坐标,采用经纬度方式 |
distance | string | 必填 | 距离,带单位,单位有km、m、cm、mm、mi、yd、ft等 |
24. geo_distance_range过滤
geo_distance过滤针对地理坐标类型字段,可以查询距离指定坐标在指定范围内的文档。和geo_distance过滤不同的是可以指定一个距离区间。
查询条件格式
ex_f_属性名=geo_distance_range(location:120.11,44.3;from:150km;to:500km)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
location | string | 必填 | 地理坐标,采用经纬度方式 |
from | string | 必填 | 距离区间起始值,带单位,单位有km、m、cm、mm、mi、yd、ft等 |
to | string | 必填 | 距离区间结束值,带单位,单位有km、m、cm、mm、mi、yd、ft等 |
23. geo_bounding_box过滤
geo_bounding_box过滤针对地理坐标类型字段,可以查询坐标在指定的矩形区域内的文档。
查询条件格式
ex_f_属性名=geo_bounding_box(top_left:12.0,2.35;bottom_right:55,66)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 要进行查询的字段 |
top_left | string | 必填 | 矩形左上角地理坐标,采用经纬度方式 |
bottom_right | string | 必填 | 矩形右下角地理坐标,采用经纬度方式 |