08-八、Elasticsearch 教程: 初体验 – 分词
前面几章节中我们安装和配置了 Elasticsearch
,也知晓了 Elasticsearch
RESTful
API
使用 HTTP
作为传输协议,使用 JSON
作为数据交换格式
任何语言或框架的入门必须是输出 Hello World
,但是,要怎么在 Elasticsearch
输出 Hello World
我却没有任何思绪
算了,我们先来讲讲分割句子
分割句子为单个单词
假如我们有一个问候语
Hello World , Nice to meet you !
我们想把它分割成一个一个单词,如
"Hello", "World", ",", "Nice", "to", "meet", "you", "!"
这在各种语言中简直就是内建操作
JavaScript
JavaScript 中可以使用 split()
方法来分割
'Hello World , Nice to meet you !'.split(' ')
输出结果如下
["Hello", "World", ",", "Nice", "to", "meet", "you", "!"]
PHP
PHP 中可以使用 explode()
方法来分割
<?php
$words = explode(' ', 'Hello World , Nice to meet you !');
print_r( $words );
输出结果如下
Array
(
[0] => Hello
[1] => World
[2] => ,
[3] => Nice
[4] => to
[5] => meet
[6] => you
[7] => !
)
Elasticsearch 分词
Elasticsearch
也可以把一个句子分割成一个一个单词,不过它有一个更好听的名字,叫做分词,能做的事情也比普通的 split()
函数多更多
Elasticsearch
可以通过向 /_analyze
发起一个 HTTP
POST
请求并传递需要分析的文本和分析器类型对一段文本进行分词
POST http://localhost:9200/_analyze
请求正文
{
"analyzer" : "standard", # 分词器,我们使用默认的 standard
"text" : "Hello World , Nice to meet you !" # 要分割的文本
}
返回响应
{
"tokens" : [
{
"token" : "hello",
"start_offset" : 0,
"end_offset" : 5,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "world",
"start_offset" : 6,
"end_offset" : 11,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "nice",
"start_offset" : 14,
"end_offset" : 18,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "to",
"start_offset" : 19,
"end_offset" : 21,
"type" : "<ALPHANUM>",
"position" : 3
},
{
"token" : "meet",
"start_offset" : 22,
"end_offset" : 26,
"type" : "<ALPHANUM>",
"position" : 4
},
{
"token" : "you",
"start_offset" : 27,
"end_offset" : 30,
"type" : "<ALPHANUM>",
"position" : 5
}
]
}
后面的章节中我们会看到这种 请求 - 请求正文 - 响应正文
的格式
1、POST http://localhost:9200/_analyze?pretty
表示对 http://localhost:9200/_analyze
发起一个 HTTP
POST
的请求
pretty 参数表示对结果进行格式化,以方便阅读
2、请求正文 表示发起的请求要传输的正文 ( body
)
3、响应正文 表示 Elasticsearch
对发起的请求的响应结果
上面这个 HTTP
请求,如果使用 curl
命令,那么格式如下
curl -XPOST http://localhost:9200/_analyze\?pretty -H'Content-Type:application/json' -d '{
"analyzer" : "standard",
"text" : "Hello World , Nice to meet you !"
}'
且会返回一个格式化了的 JSON
数据
{
"tokens" : [
{
"token" : "hello",
"start_offset" : 0,
"end_offset" : 5,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "world",
"start_offset" : 6,
"end_offset" : 11,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "nice",
"start_offset" : 14,
"end_offset" : 18,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "to",
"start_offset" : 19,
"end_offset" : 21,
"type" : "<ALPHANUM>",
"position" : 3
},
{
"token" : "meet",
"start_offset" : 22,
"end_offset" : 26,
"type" : "<ALPHANUM>",
"position" : 4
},
{
"token" : "you",
"start_offset" : 27,
"end_offset" : 30,
"type" : "<ALPHANUM>",
"position" : 5
}
]
}
从结果中可以看出 Elasticsearch
内置的标准的分词器 standard
将我们的问候语划分为 6 个单词,剔除了文本中的标点符号,同时把所有的大写字母改成了小写
作为搜索来说,这是我们想要的结果,因为大小写显得不是那么重要,至于标点符号,那就更不重要了
上面我们传递的问候语是英文的,如果我们使用中文的问候语呢,比如
你好,世界,很高兴认识你!
我们试一试吧,对 http://localhost:9200/_analyze
发起一个 HTTP POST 请求
POST http://localhost:9200/_analyze
请求正文
{
"analyzer" : "standard",
"text" : "你好,世界,很高兴认识你!"
}
返回响应
{
"tokens" : [
{
"token" : "你",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 0
},
{
"token" : "好",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 1
},
{
"token" : "世",
"start_offset" : 3,
"end_offset" : 4,
"type" : "<IDEOGRAPHIC>",
"position" : 2
},
{
"token" : "界",
"start_offset" : 4,
"end_offset" : 5,
"type" : "<IDEOGRAPHIC>",
"position" : 3
},
{
"token" : "很",
"start_offset" : 6,
"end_offset" : 7,
"type" : "<IDEOGRAPHIC>",
"position" : 4
},
{
"token" : "高",
"start_offset" : 7,
"end_offset" : 8,
"type" : "<IDEOGRAPHIC>",
"position" : 5
},
{
"token" : "兴",
"start_offset" : 8,
"end_offset" : 9,
"type" : "<IDEOGRAPHIC>",
"position" : 6
},
{
"token" : "认",
"start_offset" : 9,
"end_offset" : 10,
"type" : "<IDEOGRAPHIC>",
"position" : 7
},
{
"token" : "识",
"start_offset" : 10,
"end_offset" : 11,
"type" : "<IDEOGRAPHIC>",
"position" : 8
},
{
"token" : "你",
"start_offset" : 11,
"end_offset" : 12,
"type" : "<IDEOGRAPHIC>",
"position" : 9
}
]
}
从结果中可以看出 Elasticsearch
内置的标准的分词器 standard
将我们的问候语划分为 9
个单词,剔除了文本中的标点符号
但是,但是这是我们想要的分词结果吗?
显然不是,我们想要的不是
你 好 世 界 很 高 兴 认 识 你
我们想要的分词结果应该是
你好 世界 很 高兴 认识 你
为了达到我们想要的结果,我们就不能使用默认的分词器,我们应该使用我们中文的分词器
下一章节,我们将会介绍如何配置安装中文分词器,并对刚刚的问候语进行合适的分词
希望读者能够给小编留言,也可以点击[此处扫下面二维码关注微信公众号](https://www.ycbbs.vip/?p=28 "此处扫下面二维码关注微信公众号")
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com