distinct子句
功能說明
打散子句可以在一定程度上保證展示結(jié)果的多樣性,以提升用戶體驗(yàn)。如一次查詢可以查出很多的文檔,但是如果某個(gè)用戶的多個(gè)文檔分值都比較高,則都排在了前面,導(dǎo)致一頁中所展示的結(jié)果幾乎都屬于同一用戶,這樣既不利于結(jié)果展示也不利于用戶體驗(yàn)。對此,打散子句可以對每個(gè)用戶的文檔進(jìn)行抽取,使得每個(gè)用戶都有展示文檔的機(jī)會(huì)。
子句語法
"distinct" : {
"default": {
"dist_key" : "field",
"dist_count":number,
"dist_times" : number,
"dist_filter" : "filter_expression",
"reserved" : boolean,
"max_item_count" : number,
"grade" : []
},
"rank": {
"dist_key" : "field",
"dist_count":number,
"dist_times" : number,
"dist_filter" : "filter_expression",
"reserved" : boolean,
"max_item_count" : number,
"grade" : []
},
"rerank": {
"dist_key" : "field",
"dist_count":number,
"dist_times" : number,
"dist_filter" : "filter_expression",
"reserved" : boolean,
"max_item_count" : number,
"grade" : []
}
}
}
為了保證打散效果,引擎默認(rèn)在粗排和精排節(jié)點(diǎn)分別進(jìn)行打散。在打散時(shí)可以使用相同的打散規(guī)則,也可以分別指定不同的打散規(guī)則。不同階段打散生效規(guī)則如下:
僅指定default規(guī)則,粗排和精排都使用default進(jìn)行打散。
僅指定rank規(guī)則,僅粗排階段進(jìn)行打散。
僅指定rerank規(guī)則,僅精排階段進(jìn)行打散。
同時(shí)指定default和rank規(guī)則,粗排階段用rank規(guī)則打散,精排階段用default規(guī)則打散。
同時(shí)指定default和rerank規(guī)則,粗排階段用default規(guī)則打散,精排階段用rerank規(guī)則打散。
同時(shí)指定rank和rerank規(guī)則,粗排階段用rank規(guī)則打散,精排階段用rerank規(guī)則打散。
同時(shí)指定default、rank和rerank規(guī)則,粗排階段用rank規(guī)則打散,精排階段用rerank規(guī)則打散。
default、rank、rerank三個(gè)規(guī)則必須指定一個(gè)。
打散規(guī)則參數(shù)說明
dist_key:必選參數(shù),要打散的屬性字段。
dist_count:可選參數(shù),一輪抽取的文檔數(shù),默認(rèn)為1。
dist_times:可選參數(shù),抽取的輪數(shù),默認(rèn)為1。
dist_filter:可選參數(shù),過濾條件,被過濾的doc不參與distinct,只在后面的排序中,這些被過濾的doc將和被distinct出來的第一組doc一起參與排序。默認(rèn)是全部參與distinct。
reserved:可選參數(shù),true/false,是否保留抽取之后剩余的文檔,默認(rèn)為true。如果為false,為不保留,則搜索結(jié)果的total(總匹配結(jié)果數(shù))會(huì)不準(zhǔn)確。
max_item_count:可選參數(shù),設(shè)置計(jì)算distinct時(shí)最多保留的doc數(shù)目(最多保留數(shù)為max(max_item_count, hit))。
為了最終結(jié)果翻頁穩(wěn)定,可以設(shè)置為最大可能查詢到的文檔數(shù)目(比如每頁10條結(jié)果,最多翻頁到100頁,那么就設(shè)置為10*100=1000)。
grade:可選參數(shù),指定檔位劃分閾值,所有的文檔將根據(jù)檔位劃分閾值劃分成若干檔,每個(gè)檔位中各自根據(jù)distinct參數(shù)做distinct,可以不指定該參數(shù),默認(rèn)是所有文檔都在同一檔。檔位的劃分按照文檔排序時(shí)第一維的排序依據(jù)的分?jǐn)?shù)進(jìn)行劃分,兩個(gè)檔位閾值之間用 “|” 分開,檔位的個(gè)數(shù)沒有限制。例如:1、grade:3.0 :表示根據(jù)第一維排序依據(jù)的分?jǐn)?shù)分成兩檔,(< 3.0)的是第一檔,(>= 3.0) 的是第二檔;2、grade:3.0|5.0 :表示分成三檔,(< 3.0)是第一檔,(>= 3.0,< 5.0)是第二檔,(>= 5.0)是第三檔。檔位的先后順序和第一維排序依據(jù)的順序一致,即如果第一維排序依據(jù)是降序,則檔位也是降序,反之亦然。
示例:
"distinct" : {
"default": {
"dist_key" : "company_id",
"dist_count":2,
"dist_times" : 10
}
}
備注:按照company_id字段進(jìn)行打散抽取10輪,每輪取2個(gè)結(jié)果,抽取后的文檔排在后面
dist_count和dist_times說明
以下樣例用來解釋和說明dist_count和dist_times的用法及含義:
假設(shè)有6篇文檔,id為主鍵,name為需要做打散的字段:
doc 1: id:1 name:a
doc 2: id:2 name:a
doc 3: id:3 name:a
doc 4: id:4 name:b
doc 5: id:5 name:c
doc 6: id:6 name:c
case1:
"distinct" : {
"default": {
"dist_key" : "name",
"dist_count":2,
"dist_times" : 1
}
}
#打散結(jié)果是:doc1 doc2 doc4 doc5 doc6
case2:
"distinct" : {
"default": {
"dist_key" : "name",
"dist_count":1,
"dist_times" : 2
}
}
#打散結(jié)果是:doc1 doc4 doc5 doc2 doc6
case3:
"distinct" : {
"default": {
"dist_key" : "name",
"dist_count":1,
"dist_times" : 1
}
}
#打散結(jié)果是:doc1 doc4 doc5
distinct uniq插件
如上面描述,如果reserved=false情況下,會(huì)導(dǎo)致搜索結(jié)果中的total及viewtotal不準(zhǔn)確,如果用戶需要依賴于這個(gè)值進(jìn)行翻頁或者其他處理,則會(huì)有問題。為此,系統(tǒng)提供了distinct uniq的插件來解決在dist_times:1,dist_count:1,reserved:false的情況下的total及viewtotal展示不準(zhǔn)確。
在kvpairs中添加duniqfield:field即可。
注意:
field必須與distinct子句中的dist_key一致;
該插件僅在在dist_times:1,dist_count:1,reserved:false查詢下起作用,任何參數(shù)值有變化都將無效。
出于性能考慮,目前該插件最大支持total值為5000,即使真實(shí)搜索結(jié)果數(shù)超過5000,也會(huì)返回5000。
示例:
{
"distinct" : {
"default": {
"dist_key" : "company_id",
"dist_count":1,
"dist_times" : 1,
"reserved" : false
}
},
"kvpairs" : {
"duniqfield":"company_id"
}
}
注意事項(xiàng)
在distinct中出現(xiàn)的字段必須在定義應(yīng)用結(jié)構(gòu)的時(shí)配置為屬性字段。
不支持array類型,只支持int和literal字段類型。