1. 程式人生 > 實用技巧 >ElasticSearch - 2 分詞器

ElasticSearch - 2 分詞器

ElasticSearch - 2 分詞器

5.1 分詞器介紹

安裝包在資料資料夾中提供

5.2 ik分詞器安裝

參見 ik分詞器安裝.md

執行如下命令時如果出現 打包失敗(501碼)將maven映象換成阿里雲的

mvn package

/opt/apache-maven-3.1.1/conf/setting.xml

    <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>

5.3 ik分詞器使用(熟練)

IK分詞器有兩種分詞模式:ik_max_word和ik_smart模式。

ik_max_word

會將文字做最細粒度的拆分,比如會將“乒乓球明年總冠軍”拆分為“乒乓球、乒乓、球、明年、總冠軍、冠軍。

#方式一ik_max_word
GET /_analyze
{
  "analyzer": "ik_max_word",
  "text": "乒乓球明年總冠軍"
}

執行結果如下

{
  "tokens" : [
    {
      "token" : "乒乓球",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "乒乓",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "球",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 2
    },
    {
      "token" : "明年",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "總冠軍",
      "start_offset" : 5,
      "end_offset" : 8,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "冠軍",
      "start_offset" : 6,
      "end_offset" : 8,
      "type" : "CN_WORD",
      "position" : 5
    }
  ]
}

ik_smart

會做最粗粒度的拆分,比如會將“乒乓球明年總冠軍”拆分為乒乓球、明年、總冠軍。

#方式二ik_smart
GET /_analyze
{
  "analyzer": "ik_smart",
  "text": "乒乓球明年總冠軍"
}   

執行結果如下

{
  "tokens" : [
    {
      "token" : "乒乓球",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "明年",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "總冠軍",
      "start_offset" : 5,
      "end_offset" : 8,
      "type" : "CN_WORD",
      "position" : 2
    }
  ]
}

5.4 使用IK分詞器-查詢文件(重點)

  • 詞條查詢:term

    • 詞條查詢不會分析查詢條件,只有當詞條和查詢字串完全匹配時才匹配搜尋,不對查詢條件分詞
  • 全文查詢:match

    • 全文查詢會分析查詢條件,先將查詢條件進行分詞,然後查詢,求並集

5.4.1 建立索引,新增對映,並指定分詞器為ik分詞器

PUT person2
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword"
      },
      "address": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

5.4.2 新增文件

POST /person2/_doc/1
{
  "name":"張三",
  "age":18,
  "address":"北京海淀區"
}

POST /person2/_doc/2
{
  "name":"李四",
  "age":18,
  "address":"北京朝陽區"
}

POST /person2/_doc/3
{
  "name":"王五",
  "age":18,
  "address":"北京昌平區"
}

5.4.3 查詢對映

**GET person2**

5.4.4 檢視分詞效果

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "北京海淀"
}

5.4.5 詞條查詢:term

查詢person2中匹配到"北京"兩字的詞條

GET /person2/_search
{
  "query": {
    "term": {
      "address": {
        "value": "北京"
      }
    }
  }
}

5.4.6 全文查詢:match

全文查詢會分析查詢條件,先將查詢條件進行分詞,然後查詢,求並集

GET /person2/_search
{
  "query": {
    "match": {
      "address":"北京昌平"
    }
  }
}