elasticsearch词法分析器

2021-03-03  本文已影响0人  温岭夹糕

基本语法

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
    }
  ]
}

上一篇 下一篇

猜你喜欢

热点阅读