前言
雖然完成建議器已經能返回所有和輸入文本相匹配的結果,但有些使用案例需要過濾。這就要用到了上下文過濾器,它在完成建議器的基礎上加入了過濾功能。
上下文建議器允許用戶使用context上下文來進行過濾,上下文可以是分類(詞條)或者地理位置,為了開啟上下文,同樣在映射中指定,然后在文檔和建議中提供上下文。
完成建議器考慮索引中的所有文檔,但通常我們希望提供某些標准過濾或者提升的建議。例如,我們想要推薦某些歌手過濾的歌曲標題,或者我們希望根據其類型推廣歌曲標題。
要實現建議過濾或者提升,我們可以在配置完成字段時添加上下文映射,我們也可以為完成字段定義多個上下文映射,每個上下文映射都有唯一的名稱和類型,有兩種類型category
和geo
。上下文映射contexts
在字段映射中的參數下配置。
注意:在索引查詢啟用上下文的完成字段時,必須提供上下文。
如下示例定義了類型,每個類型都有一個完成字段的兩個上下文映射:
PUT place
{
"mappings": {
"doc":{
"properties":{
"title":{
"type":"completion",
"contexts":[
{①
"name":"place_type",
"type": "category"
},
{②
"name":"location",
"type":"geo",
"precision": 4
}
]
}
}
}
}
}
PUT place_path_category
{
"mappings": {
"doc":{
"properties":{
"title":{
"type":"completion",
"contexts":[
{③
"name":"place_type",
"type":"category",
"path":"cat"
},
{④
"name":"location",
"type":"geo",
"precision": 4,
"path":"loc"
}
]
},
"loc":{
"type":"geo_point"
}
}
}
}
}
- ①,定義category名為place_type的上下文,其中必須與建議一起發送類別。
- ②,定義一個geo名為location的上下文,其中必須使用建議發送類別。
- ③,定義category名為place_type的上下文,其中必須從cat字段字段中讀取類別。
- ④,定義geo名為location的上下文,其中從loc字段中讀取類別。
注意:添加上下文映射會增加完成字段的索引大小,完成索引完全是堆駐留的,我們可以使用Indices Stats監視完成字段索引的大小。
類別上下文
在category上下文允許我們將一個或多個類別與索引時間的建議關聯,在查詢時,建議可以通過其關聯的類別進行過濾和提升。
映射的設置與place_type上面的字段類似,如果path已定義,則從文檔中的該路徑讀取類別,否則必須在建議字段中發送它們,如下示例所示:
PUT place/doc/1
{
"title":{
"input":["timmy's", "starbucks", "dunkin donuts"],
"contexts":{
"place_type":["cafe", "food"] ①
}
}
}
- ①,這些建議將與咖啡館和食品類別相關聯。
如果映射有path, 那么以下索引請求就可以添加類別:
PUT place_path_category/doc/1
{
"title":["timmy's", "sstarbucks", "dunkin donuts"],
"cat":["cafe", "food"] ①
}
- ①,這些建議將與咖啡館和食品類別相關聯。
注意:如果上下文映射引用另一個字段並且類別被明確索引,則使用兩組類別對建議進行索引。
類別查詢
建議可以按一個或多個類別進行過濾,以下按多個類別過濾建議:
POST place/_search
{
"suggest":{
"place_suggestion":{
"prefix":"tim",
"completion":{
"field":"title",
"size": 10,
"contexts":{
"place_type":["cafe", "restaurants"]
}
}
}
}
}
注意,如果在查詢上設置了多個類別或者類別上下文,則將它們合並為分離。這意味着如果建議包含至少一個提供的上下文值,則建議匹配。
某些類別的建議可能會比其他類別高,以下按類別過濾建議,並額外提升與某些類別相關的建議:
POST place/_search
{
"suggest": {
"place_suggestion": {
"prefix": "tim",
"completion": {
"field": "title",
"size": 10,
"contexts":{
"place_type":[ ①
{
"context":"cafe"
},
{
"context":"restaurants", "boost":2
}
]
}
}
}
}
}
- ①,上下文查詢過濾建議與類別咖啡館和餐館相關聯,並且通過因子增強與餐館相關聯的建議
除了接受類別值之外,上下文查詢還可以由多個類別上下文子句組成,category上下文支持以下參數:
- context,要過濾/提升的類別的值,這是強制性的。
- boost,應該提高建議分數的因素,通過將boost乘以建議權重來計算分數,默認為1。
- prefix,是否應該將類別實為前綴,例如,如果設置為true,則可以通過指定類型的類別前綴來過濾type1,type2等類別,默認為false。
注意:如果建議條目與多個上下文匹配,則最終分數被計算為由任何匹配上下文產生的最大分數。
地理位置上下文
一個geo上下文允許我們將一個或多個地理位置或geohash與在索引時間的建議關聯,在查詢時,如果建議位於地理位置特定的距離內,則可以過濾和提升建議。
在內部,地位置被編碼為具有指定精度的地理位置。
地理映射
除了path設置,geo上下文映射還接受以下設置:
- precision,它定義了地理散列的精度要被索引並且可以指定為一個距離值(5km,10km等),或作為原料地理散列精度(1 … 12)。默認為原始geohash精度值6。
注意:索引時間precision設置可以在查詢時使用的最大geohash精度。
索引地理上下文
geo上下文可以通過參數顯式設置或通過path參數從文檔中的地理點地段建立索引,類似於category上下文,將多個地理位置上下文與建立相關聯,將為每個地理位置索引建議,以下索引具有兩個地理位置上下文的建議:
PUT place/doc/2
{
"title":{
"input":"timmy's",
"contexts":{
"location":[
{
"lat":43.6624803,
"lon":-79.3863353
},
{
"lat":43.6624718,
"lon":-79.3873327
}
]
}
}
}
地理位置查詢
建議可以根據它們與一個或多個地理點的接近程度進行過濾和提升,以下過濾建議屬於地理位置點的編碼geohash所代表的區域內的建議:
POST place/_search
{
"suggest": {
"place_suggestion": {
"prefix": "tim",
"completion": {
"field": "title",
"size": 4,
"contexts":{
"location":{
"lat": 43.662,
"lon": -79.380
}
}
}
}
}
}
注意:當指定查詢精度較低的位置時,將考慮屬於該區域內的所有建議。如果在查詢上設置了多個類別或類別上下文,則將它們合並為分離,這意味着如果建議包含至少一個提供的上下文值,則建議才匹配。
在geohash所代表的區域內的建議也可以比其他建議更高,如下所示:
POST place/_search
{
"suggest": {
"place_suggestion": {
"prefix": "tim",
"completion": {
"field": "title",
"size":10,
"contexts":{
"location":[ ①
{
"lat": 43.6624803,
"lon": -79.3863353,
"precision": 2
},
{
"context":{
"lat": 43.6624803,
"lon":-79.3863353
},
"boost": 2
}
]
}
}
}
}
}
- ①,上下文查詢過濾屬於geohash(43.662,-79.380)表示的地理位置的建議,精度為2,並提升屬於(43.6624803,-79.3863353)geohash表示的建議,默認精度為6,因數為2。
注意:如果建議條目與多個上下文匹配,則最終分數被計算為由任何匹配上下文產生的最大分數。
除了接受上下文值之外,上下文查詢還可以由多個上下文子句組成,category上下文子句支持一下參數:
- context,地理點對象或地理哈希字符串,用於過濾提升建議,這是強制性的。
- boost,應該提高建議分數的因素,通過將boost乘以建議權重來計算分數,默認為1。
- precision,geohash對查詢地理點進行編碼的精度,這可以被指定為一個距離值(5m,10km等),或作為原料地理散列精度(1 … 12)。默認為索引時間精度級別。
- neighbours,接受應該考慮相鄰地理位置的精度值數組,精度值可以是距離值(5m, 10km等)或一個原始地理散列精度(1 … 12)。默認為索引時間精度級別生成的臨近值。
see also: [Context Suggester](https://www.elastic.co/guide/en/elasticsearch/reference/7.0/suggester-context.html) 歡迎斧正,that's all