成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Elasticsearch 電商場景:明明有這個關鍵詞,但是搜不出來,怎么辦?

開發 前端
本文是基于實戰問題的思路探討。要說明的是:Ngram 的本質是空間換時間,可能會導致寫入的延時以及存儲的成倍增長,選型一定要慎重。

1、實戰問題

  • 場景:電商創業公司(非傳統巨頭)
  • 讀者描述需求:

content是一個text類型,用的 ik_max_word 分的詞,需要根據關鍵詞做精準匹配,并且按照發布時間倒序。

比如我搜:小米6s,搜出來的結果要精確匹配到:小米6s,并且按照用戶的發布時間倒序排序。

現在的問題是用 match_pharse 搜索的時候,有時候文檔里明明有這個關鍵詞,但是搜不出來,嘗試了好幾種手段......

熟悉咱們公眾號推文的同學應該知道,咱們分別在 2018年、2020年、2022年 都做過多次類似問題的討論。

探究 | 明明存在,怎么搜索不出來呢?

Elasticsearch能檢索出來,但不能正確高亮怎么辦?

由 Elasticsearch 空間換時間的線上問題說開去......

2、重新梳理一下檢索認知

2.1 分詞和詞典的本質

數據索引化的過程是借助分詞器完成的,如讀者的分詞器是 IK 中文分詞器。

問題來了?IK 中文分詞器能包含全部的詞匯嗎?

大家看 medcl 大佬開源的 IK 分詞器的源碼中能找到 main.dic 大小是 2.92 MB。并且這個詞典 8 年+ 沒有更新過。

圖片圖片

顯然:IK 默認詞典覆蓋不了全部詞匯,尤其諸如“顯眼包”、“小米14”、“奧利給”、“葉氏那拉”等的新詞。如下截圖是我自定義的詞典的詞庫檢索截圖。

圖片圖片

再來一波舉例看看:

PUT my_index_0512
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "ik_smart",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}
POST my_index_0512/_bulk
{"index":{"_id":1}}
{"title":"奧利給是一個網絡流行詞,第一次出現在一名快手主播直播時說的正能量語錄里。"}


## 分詞為:“奧利” 和 “給” 兩個詞
POST my_index_0512/_analyze
{
  "text":"奧利給是一個網絡流行詞,第一次出現在一名快手主播直播時說的正能量語錄里。",
  "analyzer":"ik_smart"
}

## 檢索不能召回結果,這里用 term 主要說明問題,合理性待商榷!
POST my_index_0512/_search
{
  "profile": true, 
  "query": {
    "term": {
      "title": "奧利給"
    }
  }
}

圖片圖片

結論:詞典決定分詞,詞典里沒有的詞,極大可能(有一定概率,比如:match_phrase 詞+詞組合的情況)檢索會檢索不到。

ps: 關于 term、match、match_phrase 區別等,推薦閱讀:檢索選型。

2.2 全文檢索的本質

全文檢索的本質是查詢待檢索的關鍵詞在寫入所創建的索引中是否存在的過程。

存在,則召回;不存在,則返回空。

2.3 明明有這個關鍵詞,但是搜不出來的本質

表面上可以看出,之前咱們2018年、2020年、2022年討論的方案用 match、match_phrase、match_phrase_prefix 等再結合 slop,貌似能解決一些問題,好像有些不召回的情況,可以召回了。

但,依然治標不治本。依然會存在一些“新詞”、“詞典里沒有的詞”等看似明明一段話里存在的詞,就是檢索不到的原因。

3、能不能根治呢?

答案:不完全能!

但,可以嘗試空間換時間,借助 Ngram 能解決 99% 以上場景的問題。

針對讀者的問題,借助 Ngram 分詞實操一下:

### 3.1 創建索引
DELETE new_spy_uat2
PUT new_spy_uat2
{
  "settings": {
    "index.max_ngram_diff": 10,
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer",
          "char_filter": ["my_char_filter"]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "pattern_replace",
          "pattern": "[^\\p{L}\\p{N}\\s]+",
          "replacement": ""
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 2,
          "max_gram": 10
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "my_analyzer",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

在提供的 Elasticsearch 配置中,my_tokenizer 是一個基于 n-gram 的分詞器,配置了從最小 2 個字符到最大 10 個字符的 n-gram。

在《一本書講透 Elasticsearch》第6.4 章節 P111 解讀了自定義分詞器的三大核心組成:

  • character filter
  • tokenizer
  • token filter

咱們上面的“my_char_filter”定義了文本在分詞前進行預處理的字符過濾規則。實際是使用正則表達式刪除所有非字母、非數字、非空格字符,只保留字母、數字和空白字符,中文字符是可以保留的。

N-gram 是一種分詞方法,通過從文本中提取 n 個連續字符的滑動窗口來創建詞元(tokens)。這種方法在處理需要部分匹配和模糊搜索的應用中非常有用,比如搜索建議和拼寫錯誤的容錯處理。

在這種配置下,文本會被分解成所有可能的 2 到 10 個字符的組合。

例如,要執行如下檢索:

POST new_spy_uat2/_analyze
{
  "analyzer":"my_analyzer",
  "text":"奧利給這幾年才流行"
}

分詞結果如下:

圖片圖片

這種方法可以大大增加索引的大小因為每個詞都被分解成多個子詞,但同時也提高了搜索的靈活性和準確性,尤其是在搜索短文本或關鍵詞片段時。

這樣的分詞器尤其適合于搜索引擎的自動補全功能和處理用戶可能的輸入錯誤,因為它能夠在用戶輸入部分信息時就開始匹配相關的詞條。

3.2 導入數據

POST new_spy_uat2/_bulk
{ "index" : { "_index" : "new_spy_uat2", "_id" : "1" } }
{ "content" : "新品豪車??限1000單食物鏈巴氏小仙包犬濕糧360g??16.9,折??8.4/袋人食級鮮肉泥,健體增肌首選(gkqHWGV0r4J)/ AC01" ,"createTime":1715323447000}
{ "index" : { "_index" : "new_spy_uat2", "_id" : "2" } }
{ "content" : "??搶??嬰兒包單??12.3起????搶??嬰兒包單??12.3起????史D??愛貝迪拉包單??忦啦??小跑快沖,錯過大腿拍青" ,"createTime":1714323447000}
{ "index" : { "_index" : "new_spy_uat2", "_id" : "3" } }
{ "content" : "盛夏光年gala青春版34/包?單拍好價???34/包?單拍好價?34/包?單拍好價???M-3XL碼  紙褲&拉褲?無卷 88vip疊+3富代" ,"createTime":1716323447000}
{ "index" : { "_index" : "new_spy_uat2", "_id" : "3" } }
{ "content" : "小米6s真便宜?34/包?單拍好價???M-3XL碼  紙褲&拉褲?無卷 88vip疊+3富代" ,"createTime":1716323447000}

3.3 驗證分詞

POST new_spy_uat2/_analyze
{
  "analyzer":"my_analyzer",
  "text":"小米6s真便宜?34/包?單拍好價???M-3XL碼  紙褲&拉褲?無卷 88vip疊+3富代"
}

圖片圖片

3.4 執行檢索

POST new_spy_uat2/_search
{
  "query": {
    "match": {
      "content": "小米6s"
    }
  }
}

如上檢索必然能找回結果。

圖片圖片

3.5 結合業務需求再完善檢索語句

POST new_spy_uat2/_search
{
  "query": {
    "match": {
      "content": "小米6s"
    }
  },
  "sort": [
    "_score",  // 先按相關性得分排序
    {
      "createTime": {
        "order": "desc"  // 再按發布時間倒序排序
      }
    }
    ]
}

此處需要結合業務情況具體問題具體分析。

4、小結

本文是基于實戰問題的思路探討。要說明的是:Ngram 的本質是空間換時間,可能會導致寫入的延時以及存儲的成倍增長,選型一定要慎重。

只有高精準檢索要求的場景才考慮 Ngram 分詞。

普通業務場景實際是容許一些數據明明存在但就是無法召回的情況的,現在主流搜索引擎Google、Bing、baidu等都肯定無法召回全部數據的。

所以,還得結合業務場景進行探討。

責任編輯:武曉燕 來源: 銘毅天下Elasticsearch
相關推薦

2011-06-20 14:32:59

關鍵詞

2011-06-07 18:45:41

關鍵詞

2011-06-14 19:11:38

關鍵詞

2023-02-07 13:51:11

SQLupdate語句

2013-08-26 15:43:40

AppStore關鍵詞開發者應用選取關鍵詞

2019-12-22 13:48:26

退休科技行業大佬

2011-05-25 17:38:56

關鍵詞

2011-05-25 17:58:00

2022-06-01 11:52:42

網站客戶端網絡

2009-11-03 09:02:59

Windows 7蘋果競爭

2011-07-22 15:48:46

SEO

2014-09-12 14:03:45

操作系統

2011-06-19 12:20:47

長尾關鍵詞

2012-03-20 22:19:16

Linux

2011-06-14 10:01:03

長尾關鍵詞

2024-07-15 09:08:51

源碼debug根節點

2011-06-10 13:34:17

關鍵詞

2011-07-06 18:18:01

關鍵詞密度

2011-06-16 17:32:48

關鍵詞

2012-04-25 16:34:04

ASO關鍵詞描述
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品精品视频一区二区三区 | 亚洲精品一区在线 | 亚洲国产成人精品一区二区 | 狠狠爱视频| 在线a视频网站 | 中文字幕亚洲专区 | 国产精品 欧美精品 | 亚洲欧美在线观看 | 日本福利视频免费观看 | 欧美一级电影免费观看 | 久久在线| 久久伊人一区 | 一级片在线视频 | 日本不卡视频 | 精品久久久久一区二区国产 | 亚洲国产精品久久久久秋霞不卡 | 中文字幕国产 | 美女激情av | 精品不卡 | 欧美日韩精品免费 | 精品国产1区2区3区 一区二区手机在线 | 久久国产亚洲 | 国产无套一区二区三区久久 | 伊人看片| 在线观看av不卡 | 日韩和的一区二在线 | www.亚洲精品 | 亚洲国产精品一区二区www | 日韩一二区 | 国产成人精品亚洲日本在线观看 | 亚洲一区二区三区在线播放 | 一级片网址 | 97久久精品午夜一区二区 | gav成人免费播放视频 | 99国产视频 | 男女深夜网站 | 久久久www成人免费精品 | 欧美精品综合在线 | 91精品国产91久久久久久最新 | 区一区二在线观看 | 欧美一区两区 |