乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      干貨 | Elasticsearch 詞頻統(tǒng)計(jì)的四種方案

       銘毅天下 2021-12-24

      1、詞頻相關(guān)實(shí)戰(zhàn)問題

      最近詞頻統(tǒng)計(jì)問題被問到的非常多,詞頻統(tǒng)計(jì)問題清單如下:

      • Q1:Elasticsearch可以根據(jù)檢索詞在doc中的詞頻進(jìn)行檢索排序嘛?
      • Q2:求教 ES 可以查詢某個(gè)索引中某個(gè)text類型字段的詞頻數(shù)量最大值和詞所在文檔數(shù)最大值么?例:索引中有兩個(gè)文檔 doc1:{"text":""}  分詞結(jié)果有兩個(gè)北京,一個(gè)南京 doc2:{"text":""} 分詞結(jié)果有一個(gè)北京想要一下結(jié)果:北京:詞頻3,文檔量2 南京:詞頻1,文檔量1
      • Q3:對某些文章的詞頻統(tǒng)計(jì)除了用fielddata之外還有沒有效率比較高的解決辦法呢?目前統(tǒng)計(jì)有時(shí)候會遇到十萬級的文章數(shù)直接在通過聚合效率上不是特別理想。

      如上三個(gè)問題都可以歸結(jié)為:Elasticsearch 文檔詞頻統(tǒng)計(jì)問題。該問題在檢索、統(tǒng)計(jì)領(lǐng)域應(yīng)用的非常多。

      那么 Elasticsearch 如何實(shí)現(xiàn)詞頻統(tǒng)計(jì)呢?有必要梳理一下。

      2、詞頻統(tǒng)計(jì)探討

      之前的文章《Elasticsearch詞頻統(tǒng)計(jì)實(shí)現(xiàn)與原理解讀》,解決的是:Q3 提及的某索引中特定關(guān)鍵詞統(tǒng)計(jì)的問題。

      解決方案是:text 字段開啟 fielddata,咱們在《長津湖影評可視化》中詞云的可視化本質(zhì)也是這種方案。

      那么,對于給定文檔的詞頻統(tǒng)計(jì)呢?

      原來開啟 fielddata 的方案就可以實(shí)現(xiàn),舉例如下:

      DELETE message_index
      PUT message_index
      {
        "mappings": {
          "properties": {
            "message": {
              "analyzer""ik_smart",
              "type""text",
              "fielddata""true"
            }
          }
        }
      }

      POST message_index/_bulk
      {"index":{"_id":1}}
      {"message":"沉溺于「輕易獲得高成就感」的事情:沉溺于有意無意地尋求用很小付出獲得很大「huibao」的偏方,哪怕huibao是虛擬的"}
      {"index":{"_id":2}}
      {"message":"過度追求“短期huibao”可以先思考這樣一個(gè)問題:為什么玩王者榮耀沉溺我們總是停不下來huibao"}
      {"index":{"_id":3}}
      {"message":"過度追求的努力無法帶來超額的huibao,就因此放棄了努力。這點(diǎn)在聰明人身上尤其明顯。以前念本科的時(shí)候身在沉溺"}



      POST message_index/_search
      {
        "size": 0,
        "query": {
          "term": {
            "_id": 1
          }
        },
        "aggs": {
          "messages": {
            "terms": {
              "size": 10,
              "field""message"
            }
          }
        }
      }

      無非在聚合的時(shí)候,加上query 語句指定了特定 id 進(jìn)行檢索。

      這種方法的缺點(diǎn)在于:正如 Q3 所說,聚合效率低。

      看過上次直播的同學(xué),可能會閃現(xiàn)一種想法,寫入前打 tag 的方式能解決嗎?

      可以解決,但有個(gè)前提。先畫個(gè)圖解釋一下:

      這個(gè)打 tag 的字段非全量,而是特定的指定腳本處理的部分。下一小節(jié)詳細(xì)實(shí)現(xiàn)一把。

      其實(shí),除了開啟 fielddata 和 打 tag 之外,在 Elasticsearch 中有 termvectors 接口也能實(shí)現(xiàn)文檔詞頻統(tǒng)計(jì)。下一小節(jié)一并實(shí)現(xiàn)。

      3、詞頻統(tǒng)計(jì)實(shí)現(xiàn)

      3.1 text 開啟 fielddata 后聚合方案

      第 2 部分已有實(shí)現(xiàn)說明,不再贅述。

      3.2 寫入前打 tag,寫入后聚合統(tǒng)計(jì)方案

      還是用第 2 部分的數(shù)據(jù),說明如下:

      PUT _ingest/pipeline/add_tags_pipeline
      {
        "processors": [
          {
            "append": {
              "field""tags",
              "value": []
            }
          },
          {
            "script": {
              "description""add tags",
              "lang""painless",
              "source""""
              if(ctx.message.contains('成就')){
                    ctx.tags.add('成就')
                 }
                  if(ctx.message.contains('王者榮耀')){
                    ctx.tags.add('王者榮耀')
                 }
                  if(ctx.message.contains('沉溺')){
                    ctx.tags.add('沉溺')
                 }
              """

            }
          }
        ]
      }

      POST message_index/_update_by_query?pipeline=add_tags_pipeline
      {
        "query": {
          "match_all": {}
        }
      }

      POST message_index/_search
      {
        "size":0, 
        "aggs": {
          "terms_aggs": {
            "terms": {
              "field""tags.keyword"
            }
          }
        }
      }

      實(shí)現(xiàn)后,結(jié)果如下:

      這種統(tǒng)計(jì)的依然是:關(guān)鍵詞(key)和文檔(doc_count)的統(tǒng)計(jì)關(guān)系。

      什么意思呢?

      "key":“沉溺”,“doc_count”:3 本質(zhì)含義是:“沉溺”在三個(gè)不同的文檔中出現(xiàn)了。

      細(xì)心的讀者會發(fā)現(xiàn),文檔 1 中“沉溺”出現(xiàn)了2次,這種打 tag 統(tǒng)計(jì)是不準(zhǔn)確的。

      3.3 term vectors 統(tǒng)計(jì)

      PUT message_index
      {
        "mappings": {
          "properties": {
            "message": {
              "type""text",
              "term_vector""with_positions_offsets_payloads",
              "store"true,
              "analyzer""ik_max_word"
            }
          }
        }
      }

      解釋一下:

      • term_vector: 檢索特定文檔字段中分詞單元的信息和統(tǒng)計(jì)信息。
      • store: 默認(rèn)未開啟存儲,需要手動設(shè)置為true。

      with_positions_offsets_payloads 是Lucene 的參數(shù)之一,釋義如下:

      可以理解為:存儲分詞單元(term vector)、位置(Token position)、偏移值(offset)、有效負(fù)載(payload,猜測是ES 新增的)。

      默認(rèn)會統(tǒng)計(jì)詞頻信息,默認(rèn)term information 為true。此外,還有 term statistics 和 field statistics 類型供設(shè)置和實(shí)現(xiàn)不同的統(tǒng)計(jì),詳細(xì)內(nèi)容參考官方文檔即可。

      https://www./guide/en/elasticsearch/reference/current/docs-termvectors.html

      執(zhí)行:

      GET message_index/_termvectors/1?fields=message

      后的返回結(jié)果如下:

      這種基于特定文檔的詞頻統(tǒng)計(jì)是傳統(tǒng)意義上我們理解的詞頻統(tǒng)計(jì)。

      默認(rèn)情況下,term vectors是實(shí)時(shí)的,而不是接近實(shí)時(shí)的??梢酝ㄟ^將 realtime 參數(shù)設(shè)置為 false 來更改。實(shí)時(shí)就意味著可能會有性能問題。

      3.4 先分詞,后 term vectors 統(tǒng)計(jì)

      在我擔(dān)心僅 termvectors 可能帶來的性能問題的時(shí)候,我想到了如下的解決方案。

      前提:寫入之前除了存儲 message 字段,加了一個(gè)分詞結(jié)果組合字段,該字段每個(gè)詞用空格做分隔。

      message 字段的前置分詞需要自己調(diào)用 analyzer API 實(shí)現(xiàn)。

      有了切詞后的字段,再做統(tǒng)計(jì)會更快。

      具體實(shí)現(xiàn)如下:

      DELETE message_ext_index
      PUT message_ext_index
      {
        "mappings": {
          "properties": {
            "message_ext": {
              "type""text",
              "term_vector""with_positions_offsets_payloads",
              "store"true,
              "analyzer""whitespace"
            }
          }
        }
      }

      POST message_ext_index/_bulk
      {"index":{"_id":1}}
      {"message_ext":"沉溺 于 輕易 獲得 高 成就感 的 事情 沉溺 有意 無意 地 尋求 用 很小 付出 獲得 很大 huibao 的 偏方 哪怕 huibao 是 虛擬 的"}

      GET message_ext_index/_termvectors/1?fields=message_ext

      強(qiáng)調(diào)一下:message_ext 使用的 whitespace 分詞器。

      4、小結(jié)

      關(guān)于詞頻統(tǒng)計(jì),本文給出四種方案。只有第3、4種方案結(jié)合termvectors 實(shí)現(xiàn)是嚴(yán)格意義上的詞頻統(tǒng)計(jì),其他兩種是詞頻-文檔關(guān)系的統(tǒng)計(jì)。

      考慮到方式3的實(shí)時(shí)分詞可能的性能問題,擴(kuò)展想到方案4前置分詞的方式,能有效提高統(tǒng)計(jì)效率。本質(zhì)也是空間換時(shí)間。

      你的實(shí)戰(zhàn)中如何實(shí)現(xiàn)的詞頻統(tǒng)計(jì)呢?歡迎留言說一下你的實(shí)現(xiàn)方式和思考。

      參考

      https:///Network/Articles/Article?AID=7c417f9f-5bde-4519-9bd5-39957d184a07 https://discuss./t/word-count-frequency-per-field/159910 https://www./guide/en/elasticsearch/reference/current/docs-termvectors.html

      推薦

      1、重磅 | 死磕 Elasticsearch 方法論認(rèn)知清單(2021年國慶更新版)
      2、Elasticsearch 7.X 進(jìn)階實(shí)戰(zhàn)私訓(xùn)課(口碑不錯(cuò))

      短時(shí)間快習(xí)得多干貨!

      已帶領(lǐng)70位球友通過 Elastic 官方認(rèn)證!

      中國僅通過百余人

      比同事搶先一步學(xué)習(xí)進(jìn)階干貨!

        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多