ES7學(xué)習(xí)筆記(七)IK中文分詞器

在上一節(jié)中,我們給大家介紹了ES的分析器,我相信大家對ES的全文搜索已經(jīng)有了深刻的印象。分析器包含3個部分:字符過濾器、分詞器、分詞過濾器。在上一節(jié)的例子,大家發(fā)現(xiàn)了,都是英文的例子,是吧?因為ES是外國人寫的嘛,中國如果要在這方面趕上來,還是需要屏幕前的小伙伴們的~

英文呢,我們可以按照空格將一句話、一篇文章進行分詞,然后對分詞進行過濾,最后留下有意義的詞。但是中文怎么分呢?中文的一句話是沒有空格的,這就要有一個強大的中文詞庫,當你的內(nèi)容中出現(xiàn)這個詞時,就會將這個詞提煉出來。這里大家也不用重復(fù)造輪子,經(jīng)過前輩的努力,這個中文的分詞器已經(jīng)有了,它就是今天要給大家介紹的IK中文分詞器。

IK中文分詞器的安裝

ES默認是沒有IK中文分詞器的,我們要將IK中文分詞器作為一個插件安裝到ES中,安裝的步驟也很簡單:

  1. 從GitHub上下載適合自己ES版本的IK中文分詞器,地址如下:https://github.com/medcl/elasticsearch-analysis-ik/releases。

  2. 在我們的ES的插件目錄中(${ES_HOME}/plugins)創(chuàng)建ik目錄,

    mkdir ik
    
  3. 將我們下載好的IK分詞器解壓到ik目錄,這里我們安裝unzip命令,進行解壓。

  4. 重啟我們所有的ES服務(wù)。

到這里,我們的IK中文分詞器就安裝完了。

IK中文分詞器初探

在上一節(jié)我們訪問了ES的分析器接口,指定了分析器和文本的內(nèi)容,我們就可以看到分詞的結(jié)果。那么既然我們已經(jīng)安裝了Ik中文分詞器,當然要看一下效果了。在看效果之前,我們先要說一下,IK中文分詞器插件給我們提供了兩個分析器。

  • ik_max_word: 會將文本做最細粒度的拆分
  • ik_smart:會做最粗粒度的拆分

我們先看看ik_max_word的分析效果吧,

POST _analyze
{
  "analyzer": "ik_max_word",
  "text":     "中華人民共和國國歌"
}

我們指定分詞器為ik_max_word,文本內(nèi)容為中華人民共和國國歌。我們看一下分詞的結(jié)果:

{
    "tokens": [
        {
            "token": "中華人民共和國",
            "start_offset": 0,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "中華人民",
            "start_offset": 0,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "中華",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "華人",
            "start_offset": 1,
            "end_offset": 3,
            "type": "CN_WORD",
            "position": 3
        },
        {
            "token": "人民共和國",
            "start_offset": 2,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 4
        },
        {
            "token": "人民",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 5
        },
        {
            "token": "共和國",
            "start_offset": 4,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 6
        },
        {
            "token": "共和",
            "start_offset": 4,
            "end_offset": 6,
            "type": "CN_WORD",
            "position": 7
        },
        {
            "token": "國",
            "start_offset": 6,
            "end_offset": 7,
            "type": "CN_CHAR",
            "position": 8
        },
        {
            "token": "國歌",
            "start_offset": 7,
            "end_offset": 9,
            "type": "CN_WORD",
            "position": 9
        }
    ]
}

我們可以看到,分詞分的非常細,我們在使用上面的這些進行搜索時,都可以搜索到中華人民共和國國歌這個文本。我們再看一下另外一個分析器ik_smart

POST _analyze
{
  "analyzer": "ik_smart",
  "text":     "中華人民共和國國歌"
}

我們的文本內(nèi)容同樣是中華人民共和國國歌,看一下分詞的效果,

{
    "tokens": [
        {
            "token": "中華人民共和國",
            "start_offset": 0,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "國歌",
            "start_offset": 7,
            "end_offset": 9,
            "type": "CN_WORD",
            "position": 1
        }
    ]
}

同樣的文本,使用ik_smart進行分詞時,只分成了兩個詞,和ik_max_word分詞器比少了很多。這就是兩個分詞器的區(qū)別,不過這兩個分析器都是可以對中文進行分詞的。

創(chuàng)建索引時指定IK分詞器

既然我們安裝了IK中文分詞器的插件,那么我們在創(chuàng)建索引時就可以為text類型的字段指定IK中文分詞器了。來看看下面的例子,

PUT ik_index
{
    "mappings": {
        "properties": {
            "id": {
                "type": "long"
            },
            "title": {
                "type": "text",
                "analyzer": "ik_max_word"
            }
        }
    }
}

我們創(chuàng)建了索引ik_index,并且為字段title指定了分詞器ik_max_word。我們執(zhí)行一下,創(chuàng)建成功。然后我們再通過GET請求看一下這個索引的映射情況。

GET ik_index/_mapping

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

{
    "ik_index": {
        "mappings": {
            "properties": {
                "id": {
                    "type": "long"
                },
                "title": {
                    "type": "text",
                    "analyzer": "ik_max_word"
                }
            }
        }
    }
}

我們可以看到title字段的分析器是ik_max_word。

為索引指定默認IK分詞器

在上一節(jié)中,我們已經(jīng)給大家介紹了為索引指定默認分詞器的方法,這里我們直接把分詞器改為IK分詞器就可以了,如下:

PUT ik_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "ik_max_word"
        }
      }
    }
  }
}

這樣我們在索引中就不用創(chuàng)建每一個字段,可以通過動態(tài)字段映射,將String類型的字段映射為text類型,同時分詞器指定為ik_max_word。我們試一下,向ik_index索引中添加一條記錄。

POST ik_index/_doc/1
{
    "id": 1,
    "title": "大興龐各莊的西瓜",
    "desc": "大興龐各莊的西瓜真是好吃,脆沙瓤,甜掉牙"
}

執(zhí)行成功。我們再執(zhí)行搜索試一下,如下:

POST ik_index/_search
{
  "query": { "match": { "title": "西瓜" } }
}

我們搜索title字段匹配西瓜,執(zhí)行結(jié)果如下:

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "ik_index",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.2876821,
                "_source": {
                    "id": 1,
                    "title": "大興龐各莊的西瓜",
                    "desc": "大興龐各莊的西瓜真是好吃,脆沙瓤,甜掉牙"
                }
            }
        ]
    }
}

我們可以看到剛才插入的那條記錄已經(jīng)搜索出來了,看來我們的IK中文分詞器起作用了,而且搜索的結(jié)果也符合我們的預(yù)期。我們再看看搜索西一個字的時候,能不能搜索到結(jié)果,

POST ik_index/_search
{
  "query": { "match": { "title": "西" } }
}

執(zhí)行結(jié)果如下:

{
    "took": 4,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 0,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    }
}

并沒有搜索出結(jié)果,說明在進行分詞時,西瓜是作為一個詞出現(xiàn)的,并沒有拆分成每一個字,這也是符合我們預(yù)期的。

好了~ 這一節(jié)的IK中文分詞器就給大家介紹到這里了~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容