2017-08-01 66 views
0

我最近從Elasticsearch 1.4升級到5.4,並且努力有效地遷移我的自動完成查詢。問題是我想要一個完成建議器,其輸出與輸入不同。使用elasticsearch完成建議器獲取與輸入不同的輸出

我存儲的文檔有一個類別字段,它基本上是一個帶有URI的字符串數組(因爲它們構成一棵樹)。 URI的最後一部分,我稱之爲label,是完成建議器中的輸入,但作爲響應,我希望檢索完整的URI。

所以我們可以說我有兩個文件:

{ 
    "name" : "Lord of The Rings", 
    "categories" : ["Books/Genre/Fantasy", "Books/Language/English"] 
} 

{ 
    "name" : "Game of Thrones", 
    "categories" : ["Series/Genre/Fantasy", "Series/Host/HBO"] 
} 

我的輸入爲「凡特」,我想作爲一個響應的URI的「系列/類型/幻想「和」書/類型/幻想「類別。

此前與ES 1.4,我能創造一個不同的輸出給定的輸入完成建議者,所以我索引我suggesters這樣的:

{ 
    "suggest" : { 
     "input": [ "Fantasy"], 
     "output": "Series/Genre/Fantasy" 
    } 
} 

{ 
    "suggest" : { 
     "input": [ "Fantasy"], 
     "output": "Books/Genre/Fantasy" 
    } 
} 

但在ES 5.4中,輸出屬性對於完成建議者不再存在,所以我得到的迴應是我建議字段的input屬性,它是標籤「幻想」,但我需要URI。

現在,我的解決方法是查找響應的_source屬性中返回的每個文檔的categories字段,並對具有以輸入「Fant」開頭的標籤的類別進行過濾。這是非常低效的,因爲我需要將每個返回文檔的每個類別映射到其標籤中以檢查輸入。

是不是有一個更有效的方式與ES建議者做到這一點?我錯過了什麼?

回答

2

Elasticsearch的完成建議從5.0改爲。 索引建議條目時指定輸出的支持已被刪除。現在建議結果條目的文本始終是建議輸入的未分析值(與在5.0之前的索引中建立索引建議時未指定輸出相同)。 所以你需要添加output作爲身體的suggest鑰匙的兄弟場。
這是它應該如何看起來像:

映射:

{ 
    "mappings": { 
     "<type>" : { 
      "properties" : { 
       "suggest" : { 
        "type" : "completion" 
       }, 
       "output" : { 
        "type": "keyword" 
       } 
      } 
     } 
    } 
} 

不要忘記你的索引類型,以取代<type>

索引:

/<index_name>/<type_name> 

{ 
    "suggest" : { 
     "input": ["Fantasy"], 
     "weight" : 1 
    }, 
    "output": "Series/Genre/Fantasy" 
} 

這裏,字段名output可以被任何東西所取代,這是你的文件剛剛元數據。

查詢:

/<index_name>/_search 

{ 
    "suggest": { 
     "show-suggest" : { 
      "prefix" : "Fant", 
      "completion" : { 
       "field" : "suggest" 
      } 
     } 
    } 
} 

我希望這有助於。

+0

這並不能解決我的問題,因爲我最終使用了與現在一樣的解決方法:查看響應中每個文檔的_source,並通過檢查輸入來獲取元數據中的信息。你的答案爲我目前的方法提供了一個優化,因爲我會將輸出添加到建議字段旁邊,並通過對匹配的建議字段進行過濾來恢復它,但對我來說,它仍然顯得效率很低......我希望輸出到'options'響應中,而不必在每個文檔的'_source'中查找它。但我不確定這是可能的。 – WhiteFangs

+1

我會說你設計你的索引,讓你在結果數組的第一個索引處得到我們想要的輸出。因此,如果您現在有多個輸出,請將它們分成多個索引,以便始終在排名最高的文檔的第一個索引上獲得最佳匹配。 我希望這個答案與您的問題最接近,如果您接受這個答案作爲對您的問題的答覆,我將不勝感激。謝謝。 – mayankchutani

+0

我認爲你是對的,那種獲得產出的舊方法(我認爲在我的具體情況下是理想的解決方案)不再存在。 – WhiteFangs

相關問題