elasticsearch之context suggester


前言

雖然完成建議器已經能返回所有和輸入文本相匹配的結果,但有些使用案例需要過濾。這就要用到了上下文過濾器,它在完成建議器的基礎上加入了過濾功能。
上下文建議器允許用戶使用context上下文來進行過濾,上下文可以是分類(詞條)或者地理位置,為了開啟上下文,同樣在映射中指定,然后在文檔和建議中提供上下文。
完成建議器考慮索引中的所有文檔,但通常我們希望提供某些標准過濾或者提升的建議。例如,我們想要推薦某些歌手過濾的歌曲標題,或者我們希望根據其類型推廣歌曲標題。
要實現建議過濾或者提升,我們可以在配置完成字段時添加上下文映射,我們也可以為完成字段定義多個上下文映射,每個上下文映射都有唯一的名稱和類型,有兩種類型categorygeo。上下文映射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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM