基本语法
POST _analyze
{
"analyzer": "分析器",
"text": "文档"
}
词法分析器的构成
文档:组成
词法分析器由3部分组成,分别是
1.Character filters
针对原始文本进行处理,比如过滤html标签
2.Tokenizer
按照一定的规则切分单词
3.Token filter
将切分后的单词进行加工,比如转为小写
所以基本语法还可以是这种形式
post _analyze
{
"char_filter":[],
"tokenizer":"",
"filter":[]
}
实验一:使用内置标准词法分析进行分析(官网demo)
POST _analyze
{
"analyzer": "standard",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
//结果为
[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ]
但是像the,a这些停用词不是我们想要的结果,应该过滤掉,这个时候就可以利用分析器的配置进行二次修改,
实验二:根据个人需求自定义一个词法分析器
方案一:利用配置
put my_index
{
"settings":{
"analysis":{
"analyzer":{
"my_analyer":{
"type":"standard", //指定词法分析器
"max_token_length":"3", //设置单个最长为3个单词
"stopwords":["a","the"] //设置停用词,可以是数组,也可以是文件
}
}
}
}
}
方案二:利用Token filter
put my_index
{
"settings":{
"analysis":{
"filter":{ //自定义 stop tokenfilter
"my_stop":{
"type" :"stop",
"stopwords":["a","the","and"] //设置停用词
}
},
"analyzer":{
"my_analyer":{
"tokenizer":"standard", //指定tokenizer,与上面不同
"filter":[ //当为数组时,需要注意顺序
"lowercase" , //转为小写,注意执行顺序,因为上面的停用词都是小写
"my_stop" //停用词过滤
]
}
}
}
}
}
当我们的语句由html文档时,需要借助Character filters来重新自定义词法分析器(内置的满足不了需求)
这里使用 html_strip Character filter
put my_index
{
"settings":{
"analysis":{
"filter":{
"my_stop":{
"type" :"stop",
"stopwords":["a","the","and"]
}
},
"analyzer":{
"my_analyer":{
"filter":[
"lowercase",
"my_stop"
],
"char_filter":["html_strip"],
"tokenizer":"standard"
}
}
}
}
}
POST my_index/_analyze
{
"analyzer": "my_analyer",
"text": "The a 2 <br>QUICK</br> Brown-Foxes jumped over the lazy dog's bone."
}
//可以观察到结果里的quick被正确的提取出来
至此,已有对词法分析的初步认知,更深入还得看文档
中文分词
因为像内置的分词器基本都是靠空白进行划分/切割单词
中文是连续的或者标点符号进行语句的划分,因此需要中文分词器
IK中文分词器
地址:https://github.com/medcl/elasticsearch-analysis-ik/releases?after=v7.5.0
进入docker容器安装,因为我的es版本是7.4的所以我选择7.4版本的
/usr/share/elasticsearch/bin/elasticsearch install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-7.4.0.zip
注意版本不匹配会报错
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
当plugin目录下出现ik文件夹就意味着在线安装成功
post _analyze
{
"analyzer":"ik_max_word",
"text":"他说的在理"
}
如何切分数字?
实际上数字会被当成一个整体(相当于keyword),也可以理解为因为没有空格默认的分词器将它切割为一个单元
post _analyze
{
"analyzer":"standard",
"text":"1234"
}
{
"tokens" : [
{
"token" : "1234",
"start_offset" : 0,
"end_offset" : 4,
"type" : "<NUM>",
"position" : 0
}
]
}
网友评论