上一章看了代碼實現,算是搞明白了各參數的意義,如今開始測試,爲方便以ik分詞示例(對elasticsearch支持較好,測試操做簡單)html
首先建index,自定義 analysisnode
ik分詞用 ik_smart 添加length filter(分詞後,只要詞長度3個以上的詞,這個後面會說明),添加min_hash(採用默認配置),注意filter順序.安全
PUT http://localhost:9200/mytestapp
{ "settings": { "analysis": { "filter": { "mymin": { "type":"min_hash", "bucket_count": 512 }, "mylength":{ "type":"length", "min":3 } }, "analyzer": { "minhashtest": { "tokenizer": "ik_smart", "filter": [ "mylength","mymin" ] } } } }, "mappings": { "test": { "properties": { "desc": { "type": "text", "analyzer": "minhashtest" } } } } }
分析測試 512個"亂碼"elasticsearch
其實看到這裏就明白爲何先擇持minhash,尚不支持simhash了.minhash原文本索引內容,查詢內容,都被構形成minhash值,minhashes的打分匹配,與其餘方式徹底兼容.但若要支持simhash,simhash計算相對很簡單,filter轉成一個二進制數據便可,可是查詢時,距離,便宜數,打分,這要實現另外一套邏輯,工做量相對大不少,若minhash知足須要,並無支持simhash的緊迫性.ide
查看匹配詳情測試
POST http://localhost:9200/mytest/test/_search?explain優化
{ "query": { "match":{ "desc":"騰訊財經 做者 李偉8月25日,海里撈被媒體臥底後廚曝出衛生情況堪憂,當天下午海底撈針此事做出反應,稱問題屬實、十分愧疚,已經部署所有門店的整改計劃。法制晚報臥底兩家北京海底撈後廚近4個月,公佈了部分圖片,稱老鼠在後廚地上亂竄、打掃衛生的簸箕和餐具同池混洗、用顧客使用的火鍋漏勺掏下水道。涉事的是海底撈勁鬆店和太陽宮店。下午,海底撈方面表示,衛生問題是他們最關注的,每月也會處理相似衛生安全事件。本次事件反應了公司管理存在問題,願意承擔經濟及法律責任。1994年,創始人張勇的第一家店面開張,店內只能容納四張餐桌。而現在,海底撈已經成爲最具影響力的火鍋店、最大亮點是貼心服務,包括爲食客免費美甲、不限量水果等,也曾被美國哈佛商學院做爲個案研究。在中國60個城市以及海外多個城市共開設了196間分店。公開資料顯示,張勇擁有68%四川海底撈餐飲有限公司的股份,63%海底撈控股的股份,以及36%頤海國際控股有限公司的股份。頤海控股是海底撈火鍋底料供應商,去年在香港上市。今年4月26日,張勇接受彭博訪問時稱,今年將可能再開新店80間,預計今年營收可達100億元人民幣,暫無心上巿;頤海國際預計今年會有20%增加。" } } }
結果(實際desc:這樣的塊,有512條,和bucket_count數量一致,我都刪掉了沒貼出來)ui
{ "_shard": "[cdp_test][4]", "_node": "71S4CkW-Qxy_8ftGX5Xc7g", "_index": "cdp_test", "_type": "test", "_id": "AV4Y-Ws2YLxRSBHq7xfS", "_score": 0.6328895, "_source": { "desc": "騰訊財經 做者 李偉8月25日,海里撈被媒體臥底後廚曝出衛生情況堪憂,當天下午海底撈針此事做出反應,稱問題屬實、十分愧疚,已經部署所有門店的整改計劃。法制晚報臥底兩家北京海底撈後廚近4個月,公佈了部分圖片,稱老鼠在後廚地上亂竄、打掃衛生的簸箕和餐具同池混洗、用顧客使用的火鍋漏勺掏下水道。涉事的是海底撈勁鬆店和太陽宮店。下午,海底撈方面表示,衛生問題是他們最關注的,每月也會處理相似衛生安全事件。本次事件反應了公司管理存在問題,願意承擔經濟及法律責任。1994年,創始人張勇的第一家店面開張,店內只能容納四張餐桌。而現在,海底撈已經成爲最具影響力的火鍋店、最大亮點是貼心服務,包括爲食客免費美甲、不限量水果等,也曾被美國哈佛商學院做爲個案研究。在中國60個城市以及海外多個城市共開設了196間分店。公開資料顯示,張勇擁有68%四川海底撈餐飲有限公司的股份,63%海底撈控股的股份,以及36%頤海國際控股有限公司的股份。頤海控股是海底撈火鍋底料供應商,去年在香港上市。今年4月26日,張勇接受彭博訪問時稱,今年將可能再開新店80間,預計今年營收可達100億元人民幣,暫無心上巿;頤海國際預計今年會有20%增加。" }, "_explanation": { "value": 0.63288957, "description": "weight(Synonym(desc:翗뒭朅䓰㧾筳熆 desc:翗뒭朅䓰㧾筳熆 desc:翗뒭朅䓰㧾筳熆 desc:翗뒭朅䓰㧾筳熆 desc:䢵㴿ﴃ羆膀䱇 desc:䢵㴿ﴃ羆膀䱇 desc:䢵㴿ﴃ羆膀䱇 desc:䢵㴿ﴃ羆膀䱇 desc:䢵㴿ﴃ羆膀䱇) in 0) [PerFieldSimilarity], result of:", "details": [ { "value": 0.63288957, "description": "score(doc=0,freq=17192.0 = termFreq=17192.0\n), product of:", "details": [ { "value": 0.2876821, "description": "idf, computed as log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5)) from:", "details": [ { "value": 1, "description": "docFreq", "details": [] }, { "value": 1, "description": "docCount", "details": [] } ] }, { "value": 2.1999617, "description": "tfNorm, computed as (freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength)) from:", "details": [ { "value": 17192, "description": "termFreq=17192.0", "details": [] }, { "value": 1.2, "description": "parameter k1", "details": [] }, { "value": 0.75, "description": "parameter b", "details": [] }, { "value": 512, "description": "avgFieldLength", "details": [] }, { "value": 1, "description": "fieldLength", "details": [] } ] } ] } ] } }
幾種優化策略spa
minhash須要大量的運算
計算次數=詞的個數*hash_count
內存佔用=bucket_count
1 適當設置bucket_count,hash_count,bucket_count越大越準確,但這須要根據場景測試調整,若是都是短句,像微博內容 bucket_count過大也無心義,一條語句平均10個詞(minhash,simhash都對短文本匹配不友好),hash_count過大,提高的效果有限,既浪費內存又浪費cpu.
2 詞的個數也能夠調整如果對長文本算模糊匹配,單個字徹底能夠忽略,之上示例加了length filter 即是爲此,只保留length>3的詞做minhash,無心義的詞最好也都過濾掉
3 短詞合併,保證單詞順序的前提下,幾個短的詞,合併成一個長的詞,也減小了詞的數量,英文推薦 shingle-tokenfilter 中文還未測試https://www.elastic.co/guide/en/elasticsearch/reference/5.5/analysis-shingle-tokenfilter.html
4另外 像 keyword tokenfilter ,unique tokenfilter會丟掉部分信息,能夠根據情景是否採用.
5最後minhash相比simhash缺乏了權重的信息,但咱們能夠從另外一個角度來添加權重,例,對全部詞統計次數,按次數排序,只對前幾條做minhash.
以上部分只是思路,對不一樣的場景適用性不一樣,具體的狀況還需進一步測試驗證
部分功能官方filter即支持,這樣最好,若官方不支持,則要自已寫filter插件了