前一篇已經翻譯過termvectors的使用方法了,這對於學習如何使用tf idf來說是很有幫助的了。 更多內容參考 "我整理的ELK教程" 什麼是TF IDF? 今天早晨起來,看《ES IN ACTION》的時候,遇到了這個術語,看英文實在不明白,於是百度了一下。看到了阮一峰的一篇關於它的文章,講 ...
前一篇已經翻譯過termvectors的使用方法了,這對於學習如何使用tf-idf來說是很有幫助的了。
更多內容參考我整理的ELK教程
什麼是TF-IDF?
今天早晨起來,看《ES IN ACTION》的時候,遇到了這個術語,看英文實在不明白,於是百度了一下。看到了阮一峰的一篇關於它的文章,講解的十分簡單明瞭,不得不佩服大家的作品,就是不一樣。
其實TF-IDF是一種全文檢索很常見的演算法,即按照關鍵詞以及權重來判斷用戶想要的是哪一個相關的文檔。
比如說,我的名字叫xingoo
這句話,想要針對它來做一次全文檢索。
第一步,就是對它進行分詞,可以分為我
的
名字
叫
xingoo
其中的
是一種停頓詞,很多文檔中都會出現,因此可以忽略。那麼關鍵詞可以變為:名字``xingoo
。那麼名字``xingoo
這兩個詞出現了多少次,就可以作為TF,即term frequnency,詞頻。
第二步,如果其他的文檔中也會出現名字
這種詞,而很少會出現xingoo
這種個性話的詞。因此採用一種逆向權重法,即越少出現的詞,越特殊,越能代表這篇文檔的特殊性。這個就叫做IDF,即Inverse Document Frequency,你文檔頻率。
關於他們的計算公式,可以參考阮一峰的文章,很容易理解的!
multi tervectors
再說回官方文檔吧,這次介紹的是一次性返回多個查詢的termvectors,原理和multi get類似,都是使用一個docs的數組,請求多個index,type,id。
curl 'localhost:9200/_mtermvectors' -d '{
"docs": [
{
"_index": "testidx",
"_type": "test",
"_id": "2",
"term_statistics": true
},
{
"_index": "testidx",
"_type": "test",
"_id": "1",
"fields": [
"text"
]
}
]
}'
索引可以放在url上面,這樣docs中就可以忽略,也可以在docs進行覆蓋:
curl 'localhost:9200/testidx/_mtermvectors' -d '{
"docs": [
{
"_type": "test",
"_id": "2",
"fields": [
"text"
],
"term_statistics": true
},
{
"_type": "test",
"_id": "1"
}
]
}'
type也是如此:
curl 'localhost:9200/testidx/test/_mtermvectors' -d '{
"docs": [
{
"_id": "2",
"fields": [
"text"
],
"term_statistics": true
},
{
"_id": "1"
}
]
}'
如果索引和類型都一樣,只有請求的id不一樣,那麼可以把id放在一個數組裡面:
curl 'localhost:9200/testidx/test/_mtermvectors' -d '{
"ids" : ["1", "2"],
"parameters": {
"fields": [
"text"
],
"term_statistics": true,
…
}
}'
由於termvectors支持用戶自己定義的文檔,而不是ES中存儲的。因此可以按照下麵的語法,請求多個自定義的文檔進行解析:
curl 'localhost:9200/_mtermvectors' -d '{
"docs": [
{
"_index": "testidx",
"_type": "test",
"doc" : {
"fullname" : "John Doe",
"text" : "twitter test test test"
}
},
{
"_index": "testidx",
"_type": "test",
"doc" : {
"fullname" : "Jane Doe",
"text" : "Another twitter test ..."
}
}
]
}'