美文网首页
elasticsearch词法分析器

elasticsearch词法分析器

作者: 温岭夹糕 | 来源:发表于2021-03-03 00:32 被阅读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
        }
      ]
    }
    
    

    相关文章

      网友评论

          本文标题:elasticsearch词法分析器

          本文链接:https://www.haomeiwen.com/subject/fjmsrktx.html