<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Elasticsearch從入門到放棄:分詞器初印象

          共 5077字,需瀏覽 11分鐘

           ·

          2020-07-11 04:26

          cf88aa31ed662781cec692b2e03b4571.webp點(diǎn)擊上方“藍(lán)字”關(guān)注我們吧!4cf9f4066f4ab4496fd8550269898fef.webp

          Elasticsearch 系列回來(lái)了,先給因?yàn)檫@個(gè)系列關(guān)注我的同學(xué)說(shuō)聲抱歉,拖了這么久才回來(lái),這個(gè)系列雖然叫「Elasticsearch 從入門到放棄」,但只有三篇就放棄還是有點(diǎn)過(guò)分的,所以還是回來(lái)繼續(xù)更新。

          之前我們聊過(guò)了 Elasticsearch 的索引和文檔,不太熟悉的話可以先翻閱一下前文。今天再一起聊一下 Elasticsearch 的分詞器。

          關(guān)于分詞

          如果你是講 Elasticsearch 作為搜索引擎,那么你應(yīng)該需要對(duì)分詞進(jìn)行了解,Elasticsearch 的分詞是將全文本轉(zhuǎn)換為一系列單詞,這樣有助于在搜索時(shí)得到相關(guān)的結(jié)果以及相關(guān)性分析。例如我們有一個(gè)文本為“I love Elasticsearch”,然后 Elasticsearch 可以將其分解為三個(gè)單詞,這時(shí)我們無(wú)論搜索哪個(gè)單詞,都能搜到這個(gè)文本。

          Elasticsearch 通過(guò)分詞器對(duì)文本進(jìn)行分詞處理,Elasticsearch 的分詞器是由 Character Filters、Tokenizer 和Token Filter 三部分組成。在介紹它們之前,我們先來(lái)簡(jiǎn)單了解一下 Analyze API,它可以幫助我們快速測(cè)試一個(gè) ?Analyzer 的作用,它的用法也非常簡(jiǎn)單:

          GET?/_analyze
          {
          ??"analyzer"?:?"standard",
          ??"text"?:?"Quick?Brown?Foxes!"
          }

          其中,analyzer 是指定的分詞器,text 是被測(cè)試的文本,這樣就能得到這個(gè)文本分詞后的效果。

          這是最簡(jiǎn)單的一種用法,此外,我們還可以在 path 中指定 index,用于測(cè)試指定索引中 mapping 設(shè)置的 analyzer 或者索引默認(rèn)的 analyzer。當(dāng)然,你也可以測(cè)試一下自定義的 analyzer,只需要在參數(shù)中設(shè)置好 Character Filters、Tokenizer 和Token Filter 即可。關(guān)于 Analyze API 更多的使用方法可以自行查閱官方文檔 Analyze API

          內(nèi)置 Analyzer

          為了方便使用,Elasticsearch 為我們提供了幾種內(nèi)置 Analyzer:

          • Fingerprint:它可以將文本處理為小寫的、去除擴(kuò)展的、有序的、唯一的單詞

          • Keyword:不分詞

          • Language:提供了30多種常見語(yǔ)言的分詞器

          • Pattern:使用正則表達(dá)式分詞,默認(rèn)\W+(非字符分隔)

          • Simple:按照非字母切分,小寫處理

          • Standard:默認(rèn)分詞器,會(huì)基于 Unicode 文本語(yǔ)法,按照單詞劃分,并進(jìn)行小寫處理

          • Stop:小寫處理,過(guò)濾停用詞(the, a, is)

          • Whitespace:按照空格切分,不轉(zhuǎn)小寫

          現(xiàn)在我們來(lái)測(cè)試一下 Whitespace Analyzer

          GET?_analyze
          {
          ??"analyzer":?"whitespace",
          ??"text":?"The?2?QUICK?Brown-Foxes?jumped?over?the?lazy?dog's?bone."
          }

          它的執(zhí)行結(jié)果是

          {
          ??"tokens"?:?[
          ????{
          ??????"token"?:?"The",
          ??????"start_offset"?:?0,
          ??????"end_offset"?:?3,
          ??????"type"?:?"word",
          ??????"position"?:?0
          ????},
          ????{
          ??????"token"?:?"2",
          ??????"start_offset"?:?4,
          ??????"end_offset"?:?5,
          ??????"type"?:?"word",
          ??????"position"?:?1
          ????},
          ????{
          ??????"token"?:?"QUICK",
          ??????"start_offset"?:?6,
          ??????"end_offset"?:?11,
          ??????"type"?:?"word",
          ??????"position"?:?2
          ????},
          ????{
          ??????"token"?:?"Brown-Foxes",
          ??????"start_offset"?:?12,
          ??????"end_offset"?:?23,
          ??????"type"?:?"word",
          ??????"position"?:?3
          ????},
          ????{
          ??????"token"?:?"jumped",
          ??????"start_offset"?:?24,
          ??????"end_offset"?:?30,
          ??????"type"?:?"word",
          ??????"position"?:?4
          ????},
          ????{
          ??????"token"?:?"over",
          ??????"start_offset"?:?31,
          ??????"end_offset"?:?35,
          ??????"type"?:?"word",
          ??????"position"?:?5
          ????},
          ????{
          ??????"token"?:?"the",
          ??????"start_offset"?:?36,
          ??????"end_offset"?:?39,
          ??????"type"?:?"word",
          ??????"position"?:?6
          ????},
          ????{
          ??????"token"?:?"lazy",
          ??????"start_offset"?:?40,
          ??????"end_offset"?:?44,
          ??????"type"?:?"word",
          ??????"position"?:?7
          ????},
          ????{
          ??????"token"?:?"dog's",
          ??????"start_offset"?:?45,
          ??????"end_offset"?:?50,
          ??????"type"?:?"word",
          ??????"position"?:?8
          ????},
          ????{
          ??????"token"?:?"bone.",
          ??????"start_offset"?:?51,
          ??????"end_offset"?:?56,
          ??????"type"?:?"word",
          ??????"position"?:?9
          ????}
          ??]
          }

          如果有興趣,可以自行測(cè)試一下其他的內(nèi)置 Analyzer。除了內(nèi)置的 Analyzer 之外,你也可以根據(jù)需要自定義分詞器。

          下面我們來(lái)看怎么定義我們需要的 Analyzer。

          前面提到 Analyzer 由三部分組成,其中 Character Filters 用于對(duì)原始文本進(jìn)行處理(例如去掉html標(biāo)簽),Tokenizer 是按照指定規(guī)則進(jìn)行切分,Token Filter 負(fù)責(zé)將切分的單詞進(jìn)行加工(例如轉(zhuǎn)小寫)。

          Character Filters

          Character Filters 是分詞的第一步,Elasticsearch 用它來(lái)對(duì)原始文本進(jìn)行一些處理。內(nèi)置的 Character Filters 有三個(gè),分別是:

          • HTML strip:使用解碼值替換HTML標(biāo)簽

          • Mapping:使用指定的替換項(xiàng)替換指定的字符串

          • Pattern replace:使用指定的替換項(xiàng)替換正則匹配的字符串

          HTML strip 默認(rèn)會(huì)替換文本中所有的 HTML 標(biāo)簽,你也可以通過(guò)設(shè)置escaped_tags,將一些特定的標(biāo)簽排除

          PUT?my_index
          {
          ??"settings":?{
          ????"analysis":?{
          ??????"analyzer":?{
          ????????"my_analyzer":?{
          ??????????"tokenizer":?"keyword",
          ??????????"char_filter":?[
          ????????????"my_custom_html_strip_char_filter"
          ??????????]
          ????????}
          ??????},
          ??????"char_filter":?{
          ????????"my_custom_html_strip_char_filter":?{
          ??????????"type":?"html_strip",
          ??????????"escaped_tags":?[
          ????????????"b"
          ??????????]
          ????????}
          ??????}
          ????}
          ??}
          }

          這個(gè)自定義 Analyzer 就不會(huì)替換標(biāo)簽 b。

          63a4d409d2f04927cd83d9edbb2bc1d8.webp

          Tokenizer

          在對(duì)原始文本進(jìn)行初步的處理之后,Tokenizer 就要上場(chǎng)了,它幫助我們根據(jù)指定的規(guī)則進(jìn)行分詞,Elasticsearch 同樣提供了一些內(nèi)置的 Tokenizer。

          • Character group:按照配置的字符組進(jìn)行切分

          • Classic:針對(duì)英語(yǔ)語(yǔ)法進(jìn)行分詞

          • Edge n-gram:從單詞的起始字符開始按長(zhǎng)度依次切分quick 會(huì)被分為[q, qu, qui, quic, quick]

          • Keyword:不切分

          • Letter:遇到非字母的字符進(jìn)行切分

          • Lowercase:與類似 Letter 類似,不過(guò)它會(huì)把切分后的單詞轉(zhuǎn)為小寫

          • N-gram:把單詞切分為指定長(zhǎng)度的字符串集合,quick 會(huì)被分為[qu, ui, ic, ck]

          • Path hierarchy:對(duì)路徑進(jìn)行切分,/foo/bar/baz 會(huì)分為[/foo, /foo/bar, /foo/bar/baz]

          • Pattern:根據(jù)正則匹配進(jìn)行切分

          • Simple pattern:正則會(huì)受到一些限制,但不支持按照匹配到的分割符切分

          • Simple pattern split:是支持按照匹配到的分割符切分的Simple pattern

          • Standard:按照單詞進(jìn)行切分

          • Thai:針對(duì)泰語(yǔ)進(jìn)行切分

          • UAX URL email:與 Standard 相似,但它會(huì)把 url 或郵箱當(dāng)作一個(gè)整體

          • Whitespace:按照空格進(jìn)行切分

          在這里你可以先對(duì)這些內(nèi)置的 Tokenizer 有個(gè)初步的了解,知道它們能干什么,在具體使用的時(shí)候可以查閱官方文檔進(jìn)行更詳細(xì)的了解,很多 Tokenizer 還支持一些參數(shù)配置,這些到實(shí)際場(chǎng)景中靈活使用就好。

          Token Filter

          Elasticsearch 內(nèi)置的 Token Filter 非常多,這里列幾個(gè)常用的吧:

          • Trim:刪除前后空格

          • Uppercase:轉(zhuǎn)大寫

          • Lowercase:轉(zhuǎn)小寫

          • Stop:停用詞過(guò)濾

          • ……

          Elasticsearch 中內(nèi)置的這些分詞器及組件可以滿足我們?nèi)粘5拇蟛糠中枨罅耍軌蜃龅届`活應(yīng)用就很厲害了。如果真的遇到解決不了的問(wèn)題,你也可以嘗試自定義分詞器,例如對(duì)我們的中文進(jìn)行分詞。

          中文分詞

          中文分詞的難點(diǎn)在于,它不像英文那樣有天然的空格可以進(jìn)行切分,我們也不能簡(jiǎn)單的把它分成一個(gè)個(gè)的字,而是要分成有意義的詞。

          比較不錯(cuò)的中文分詞器有 ICU Analyzer、IK 和 THULAC

          ICU Analyzer

          ICU Analyzer 并不是 Elasticsearch 內(nèi)置的分詞器,所以我們需要預(yù)先安裝插件才能使用

          執(zhí)行命令

          elasticsearch-plugin?install?analysis-icu

          進(jìn)行安裝,安裝好以后可以使用命令elasticsearch-plugin list進(jìn)行查看。

          安裝好之后就可以運(yùn)行下面這個(gè)例子

          GET?_analyze
          {
          ??"analyzer":?"standard",?
          ??"text":?"覺得好看就點(diǎn)贊"
          }

          GET?_analyze
          {
          ??"analyzer":?"icu_analyzer",?
          ??"text":?"覺得好看就點(diǎn)贊"
          }

          你會(huì)發(fā)現(xiàn) standard analyzer 就是把這句話拆成一個(gè)個(gè)字,而 icu analyzer 基本會(huì)根據(jù)語(yǔ)義進(jìn)行拆分。

          總結(jié)

          經(jīng)過(guò)本文的介紹,相信你對(duì) Elasticsearch 的分詞器也有了一個(gè)初步的認(rèn)識(shí),知道它由什么組成,能夠使用 Analyze API 對(duì)一個(gè)分詞器進(jìn)行簡(jiǎn)單的測(cè)試,也基本能夠自定義一些分詞器了。

          我對(duì)內(nèi)置的 Token Filter 介紹的比較少,你可以結(jié)合官方文檔,對(duì)你感興趣的 Token Filter 進(jìn)行更深入的研究,如果有什么問(wèn)題也歡迎和我討論。

          ▼往期精彩回顧▼Elasticsearch從入門到放棄:文檔CRUD要牢記
          Elasticsearch從入門到放棄:索引基本使用方法
          Elasticsearch從入門到放棄:人生若只如初見
          瀏覽 52
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  看A片视频 | 色噜噜一区二区三区 | 黄色一级久久久精品 | 无码人妻精品一区二区三区99仓 | 我就色色综合网 |