本文介紹如何在elk search實現相似搜索的思路
相似搜索的應用場景
- 回答問題:如果已有一系列常見問題,則可通過文本相似度來查找與用戶所輸入問題相似的問題。
- 文章搜索:從一系列文章中,返回與用戶查詢內容相關的文章。
- 圖片搜索:對於由包含說明的圖片組成的數據集,從中查找哪些圖片的說明與用戶描述相似。
如何實現?
目前elasticsearch有兩種方案:
- dense-vector
- More Like This Query
dense-vector在elk 7.3版本開始支持,需要x-pack模塊,且需要在索引的時候就處理並生成dense-vector,相對比較麻煩
More Like This Query是一個查詢語法,在任意版本均可用,無需x-pack,且無需改動已經index的內容,語法如下
GET /_search
{
"query": {
"more_like_this" : {
"fields" : ["title", "description"],
"like" : "Once upon a time",
"min_term_freq" : 1,
"max_query_terms" : 12
}
}
}
- fields:要執行查詢的欄位
- like:要查詢相似的文本
- min_term_freq:最小詞頻率,低於該頻率的詞將被忽略
- max_query_terms:提取詞的最大個數,其余的詞將被忽略
另外,它還可以以某幾篇具體的文章為標准來查詢相似內容
GET /_search
{
"query": {
"more_like_this" : {
"fields" : ["title", "description"],
"like" : [
{
"_index" : "imdb",
"_id" : "1"
},
{
"_index" : "imdb",
"_id" : "2"
},
"and potentially some more text here as well"
],
"min_term_freq" : 1,
"max_query_terms" : 12
}
}
}
原理
MLT查詢從輸入文檔中提取文本,通常使用該字段中的同一分析器對其進行分析,然后選擇tf-idf最高的前K個詞構成這些詞的析取查詢。