elasticsearch minhash 測試應用

上一章看了代碼實現,算是搞明白了各參數的意義,如今開始測試,爲方便以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插件了

相關文章
相關標籤/搜索