zoukankan      html  css  js  c++  java
  • 2. ES 分析过程

    ES 分析过程

    参考网址:https://www.cnblogs.com/Neeo/articles/10593037.html

    当数据被发送到elasticsearch后并加入到倒排索引之前,elasticsearch会对该文档的进行一系列的处理步骤:

    • 字符过滤:使用字符过滤器转变字符。
    • 文本切分为分词:将文本(档)分为单个或多个分词。
    • 分词过滤:使用分词过滤器转变每个分词。
    • 分词索引:最终将分词存储在Lucene倒排索引中。

    整体流程如下图所示:

    ![](E:Python学习11.搜索引擎-数据库进阶day103 - es分析过程,python批量写入1.bmp)

    接下来,我们简要的介绍elasticsearch中的分析器、分词器和分词过滤器

    分析器 - analyzer

    1.标准分析器(standard analyzer):是elasticsearch的默认分析器,该分析器综合了大多数欧洲语言来说合理的默认模块,包括标准分词器、标准分词过滤器、小写转换分词过滤器和停用词分词过滤器。

    2.简单分析器(simple analyzer):简单分析器仅使用了小写转换分词,这意味着在非字母处进行分词,并将分词自动转换为小写

    3.空白(格)分析器(whitespace analyzer):这玩意儿只是根据空白将文本切分为若干分词,真是有够偷懒!

    4.停用词分析(stop analyzer)和简单分析器的行为很像,只是在分词流中额外的过滤了停用词

    5.模式分析器(pattern analyzer)允许我们指定一个分词切分模式。但是通常更佳的方案是使用定制的分析器,组合现有的模式分词器和所需要的分词过滤器更加合适。

    6.语言和多语言分析器:chinese -- 对中文不太友好

    7.雪球分析器(snowball analyzer)除了使用标准的分词和分词过滤器(和标准分析器一样)也是用了小写分词过滤器和停用词过滤器,除此之外,它还是用了雪球词干器对文本进行词干提取。

    # 测试 标准分词器
    
    POST _analyze
    {
      "analyzer": "standard",
      "text": "To be or not to be,  That is a question ———— 莎士比亚"
    }
    
    # 简单分词器
    POST _analyze
    {
      "analyzer": "simple",
      "text":"To be or not to be,  That is a question ———— 莎士比亚"
    }
    

    字符过滤器

    字符过滤器在<charFilter>属性中定义,它是对字符流进行处理。字符过滤器种类不多。elasticearch只提供了三种字符过滤器:

    • HTML字符过滤器(HTML Strip Char Filter)
    • 映射字符过滤器(Mapping Char Filter)
    • 模式替换过滤器(Pattern Replace Char Filter)

    HTML字符过滤器

    HTML字符过滤器(HTML Strip Char Filter)从文本中去除HTML元素

    POST _analyze
    {
      "tokenizer": "keyword",
      "char_filter": ["html_strip"],
      "text":"<p>I&apos;m so <b>happy</b>!</p>"
    }
    

    映射字符过滤器

    映射字符过滤器(Mapping Char Filter)接收键值的映射,每当遇到与键相同的字符串时,它就用该键关联的值替换它们。

    PUT pattern_test4
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer":{
              "tokenizer":"keyword",
              "char_filter":["my_char_filter"]
            }
          },
          "char_filter":{
              "my_char_filter":{
                "type":"mapping",
                "mappings":["苍井空 => 666","武藤兰 => 888"]
              }
            }
        }
      }
    }
    

    上例中,我们自定义了一个分析器,其内的分词器使用关键字分词器,字符过滤器则是自定制的,将字符中的苍井空替换为666,武藤兰替换为888。

    POST pattern_test4/_analyze
    {
      "analyzer": "my_analyzer",
      "text": "苍井空热爱武藤兰,可惜后来苍井空结婚了"
    }
    

    模式替换过滤器

    模式替换过滤器(Pattern Replace Char Filter)使用正则表达式匹配并替换字符串中的字符。但要小心你写的抠脚的正则表达式。因为这可能导致性能变慢!

    PUT pattern_test5
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer": {
              "tokenizer": "standard",
              "char_filter": [
                "my_char_filter"
              ]
            }
          },
          "char_filter": {
            "my_char_filter": {
              "type": "pattern_replace",
              "pattern": "(\d+)-(?=\d)",
              "replacement": "$1_"
            }
          }
        }
      }
    }
    

    上例中,我们自定义了一个正则规则。

    POST pattern_test5/_analyze
    {
      "analyzer": "my_analyzer",
      "text": "My credit card is 123-456-789"
    }
    

    分词器

    由于elasticsearch内置了分析器,它同样也包含了分词器。分词器,顾名思义,主要的操作是将文本字符串分解为小块,而这些小块这被称为分词token

    1.标准分词器(standard tokenizer):是一个基于语法的分词器,对于大多数欧洲语言来说还是不错的

    2.关键词分词器(keyword tokenizer)是一种简单的分词器,将整个文本作为单个的分词,提供给分词过滤器,当你只想用分词过滤器,而不做分词操作时,它是不错的选择。

    3.字母分词器(letter tokenizer)根据非字母的符号,将文本切分成分词

    4.空白分词器(whitespace tokenizer)通过空白来分隔不同的分词,空白包括空格、制表符、换行等。但是,我们需要注意的是,空白分词器不会删除任何标点符号。

    5.模式分词器(pattern tokenizer)允许指定一个任意的模式,将文本切分为分词。

    .......等等

    # 测试
    POST _analyze
    {
      "tokenizer": "standard",
      "text":"To be or not to be,  That is a question ———— 莎士比亚"
    }
    

    IK分词器插件的安装

    参考网址:https://www.cnblogs.com/Neeo/articles/10613793.html

    下载

    打开Github官网,搜索elasticsearch-analysis-ik,单击medcl/elasticsearch-analysis-ik

    ![1620652709783](E:Python学习11.搜索引擎-数据库进阶day103 - es分析过程,python批量写入assets1620652709783.png)

    选择与es一样的版本下载,

    安装

    首先打开C:Program Fileselasticseach-6.5.4pluginses安装插件目录,新建一个名为ik的子目录,并将elasticsearch-analysis-ik-6.5.4.zip包解压到该ik目录内,就可以用了

    ik_smart: 该参数将文档作最粗粒度的拆分

    ik_max_word 该参数将文档作最细粒度的拆分

    第一个ik示例
    GET _analyze
    {
      "analyzer": "ik_max_word",
      "text": "上海自来水来自海上"
    }
    
    建立索引,指定分词器
    PUT ik1
    {
      "mappings": {
        "doc": {
          "dynamic": false,
          "properties": {
            "content": {
              "type": "text",
              "analyzer": "ik_max_word"
            }
          }
        }
      }
    }
    
    

    ik中的短语查询参照之前的短语查询即可

    GET ik1/_search
    {
      "query": {
        "match_phrase": {
          "content": "今天"
        }
      }
    }
    
    

    ik之短语前缀查询

    GET ik1/_search
    {
      "query": {
        "match_phrase_prefix": {
          "content": {
            "query": "今天好日子",
            "slop": 2
          }
        }
      }
    }
    
    
  • 相关阅读:
    wpf 控件回车事件中调用tab实现方法
    C#中M的N次方显示
    新概念英语第三册单词
    新概念英语第二册单词
    手把手教你搭建一个vue项目
    Vuex里的module选项和移动端布局
    Vuex与axios的封装和调用
    Vue路由
    Vue脚手架的搭建和路由配置
    Vue全家桶之一Vue(基础知识篇)
  • 原文地址:https://www.cnblogs.com/jia-shu/p/14805478.html
Copyright © 2011-2022 走看看