ElasticSearch - 2 分詞器
阿新 • • 發佈:2020-12-28
ElasticSearch - 2 分詞器
5.1 分詞器介紹
- IKAnalyzer是一個開源的,基於java語言開發的輕量級的中文分詞工具包
- 是一個基於Maven構建的專案
- 具有60萬字/秒的高速處理能力
- 支援使用者詞典擴充套件定義
- 下載地址:https://github.com/medcl/elasticsearch-analysis-ik/archive/v7.4.0.zip
安裝包在資料資料夾中提供
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":"北京昌平"
}
}
}