Elasticsearch 分词器切词器分析器

这篇具有很好参考价值的文章主要介绍了Elasticsearch 分词器切词器分析器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

normalization : 文档规范化

先切词,然后规范化.

规范化要规范哪些内容?

大小写; 标点符号; 时态; 复数;

规范化主要是为了匹配更精准

character filter : 字符过滤器. 标点符号

分词之前的预处理,过滤无用字符

  • HTML Strip Character Filter

    :html_strip

    • 参数:escaped_tags 需要保留的html标签
  • Mapping Character Filter:type mapping

  • Pattern Replace Character Filter:type pattern_replace



> normalization 通过分词器把单词分词然后规范化  查看具体分词器效果
​```json
GET _analyze
{
  "text": "the computer Apple is the best Tools, Teacher's notebood",
  "analyzer": "english"
}
GET _analyze
{
  "text": "the computer Apple is the best Tools",
  "analyzer": "standard"
}
​```

- HTML strip 过滤html标签
- mapping 映射替换的标点符号等
- pattern Replace 正则替换
- 分词器在创建时指定
DELETE test_idx_analyzer1
PUT test_idx_analyzer1
{
  "settings": {
    // 这里是分析器 不是分词器; 分词器可以包含设置过滤器和分词器
    "analysis": {
      // 这个有四种类型具体看官方文档
      "char_filter": {
        // 分词器名称
        "test_char_filter1": {
          // 指定具体的类型, 具体类型看官方文档, 
          "type": ["html_strip"],
          "escaped_tags": ["a"]
        }
      },
      "analyzer": {
        "test_analyzer1": {
          "tokenizer": "keyword",
          "char_filter": "test_char_filter1"
        }
      }
    }
  }
}```html
<p> I&apos;m so <a>Happy</a></p>
​```
GET test_idx_analyzer1/_analyze
{
  "analyzer": "test_analyzer1"
  , "text": "<p> I&apos;m so <a>Happy</a></p>"
}

### mapping
DELETE test_idx_analyzer3
PUT test_idx_analyzer3
{
  "settings": {
    // 这里是分析器 不是分词器; 分词器可以包含设置过滤器和分词器
    "analysis": {
      // 这个有四种类型具体看官方文档
      "char_filter": {
        "test_mapping_filter1": {
          "type": "mapping",
          "mappings":[
            "滚 => *",
            "蛋 => x"
            ]
        }
      },
      "analyzer": {
        "test_analyzer2": {
          "tokenizer": "keyword",
          "char_filter": ["test_mapping_filter1"]
        }
      }
    }
  }
}
GET test_idx_analyzer3/_analyze
{
  "analyzer": "test_analyzer2"
  , "text": "滚蛋球"
}

### Pattern replace


### pattern replace
DELETE test_idx_analyzer3
PUT test_idx_analyzer3
{
  "settings": {
    // 这里是分析器 不是分词器; 分词器可以包含设置过滤器和分词器
    "analysis": {
      // 这个有四种类型具体看官方文档
      "char_filter": {
        "test_mapping_filter1": {
          "type": "pattern_replace",
          "pattern": "(\\d{3})(\\d{4})(\\d{4})",
          "replacement": "$1***$2"
        }
      },
      "analyzer": {
        "test_analyzer2": {
          "tokenizer": "keyword",
          "char_filter": ["test_mapping_filter1"]
        }
      }
    }
  }
}
GET test_idx_analyzer3/_analyze
{
  "analyzer": "test_analyzer2"
  , "text": "12345677890"
}

tokenizer : 分词器

安装IK分词器

IK地址:

https://github.com/medcl/elasticsearch-analysis-ik/blob/master/README.md

分词器安装目录
es_home/plugins/ik
分词器安装方式

// 此例子可能需要安装插件, 插件安装有单独一节进行讲解见后
每个节点同义词文件都要同步吗?是的
// ik每个node都要安装; 如果版本不对有两种办法

  1. 手动编译安装
  2. 相近的版本可以直接修改版本

如何手动安装?

git clone https://github.com/medcl/elasticsearch-analysis-ik
cd elasticsearch-analysis-ik
git checkout tags/{version}
mvn clean
mvn compile
mvn package
拷贝和解压release下的文件: #{project_path}/elasticsearch-analysis-ik/target/releases/elasticsearch-analysis-ik-*.zip 到你的 elasticsearch 插件目录, : plugins/ik 重启elasticsearch

相近的版本可以直接修改版本

vim plugin-descriptor.properties
修改
elasticsearch.version=your_version

> 如果修改plugin-descriptor.properties里的版本号不行的话,还有elasticsearch-analysis-ik-xxx.jar内pom.properties里的版本号。
常见分词器
  • standard analyzer:默认分词器,中文支持的不理想,会逐字拆分。
  • pattern tokenizer:以正则匹配分隔符,把文本拆分成若干词项。
  • simple pattern tokenizer:以正则匹配词项,速度比pattern tokenizer快。
  • whitespace analyzer:以空白符分隔 Tim_cookie

自定义分词器:custom analyzer

char_filter:内置或自定义字符过滤器 。

token filter:内置或自定义token filter 。

tokenizer:内置或自定义分词器。

中文分词器IK

IK分词器

安装和部署
  • ik下载地址:https://github.com/medcl/elasticsearch-analysis-ik
  • Github加速器:https://github.com/fhefh2015/Fast-GitHub
  • 创建插件文件夹 cd your-es-root/plugins/ && mkdir ik
  • 将插件解压缩到文件夹 your-es-root/plugins/ik
  • 重新启动es
  1. IK文件描述
    • IKAnalyzer.cfg.xml:IK分词配置文件
  • 主词库:main.dic
    • 英文停用词:stopword.dic,不会建立在倒排索引中
    • 特殊词库:
      • quantifier.dic:特殊词库:计量单位等
      • suffix.dic:特殊词库:行政单位
      • surname.dic:特殊词库:百家姓
      • preposition:特殊词库:语气词
    • 自定义词库:网络词汇、流行词、自造词等
  1. ik提供的两种analyzer:
    1. ik_max_word会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;
    2. ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。

扩展IK词库

修改IKAnalyzer.cfg.xml中自定义词库的路径,路径原则上可以随便放,管理是跟ik放一起,建一个custome目录

Elasticsearch 分词器切词器分析器,Elasticsearch,ES,elasticsearch,大数据

token filter : 令牌过滤器

停用词、时态转换、大小写转换、同义词转换、语气词处理等。比如:has=>have him=>he apples=>apple the/oh/a=>干掉

处理大小写

// why get not PUT
// I miss the keyword _analyze,why? cannot understand better?
// this way is operate exists index to do query
GET /test_index02/_analyze
{
  "tokenizer": "standard",
  "filter": {
    "type": "condition",
    "filter": "uppercase",
    "script": {
      "source": "token.getTerm().length() < 5"
    }
  },
  "text": ["abdsfs sdf dsfdsf dsf dsfdsf sd fds fds f dsf sd f dsf sd fs df sdf dsfdsfdsfs dfdsfds"]
}
token_filter同义词替换
  • 定义同义词词典文件 格式 src1,src2 => target

  • vim analysis/synonyms.txt
    Mengdiudiu,mengdiudiu => MDO
    
  • 同步到目录 es_home/config/analysis/your_dict.txt

  • 如何验证是否生效:

  • DELETE test_index01
    PUT /test_index01
    {
      "settings": {
        "index": {
          "analysis": {
            "analyzer": {
              "test_index01_synonym": {
                "tokenizer": "whitespace",
                "filter": [ "test_index01_synonym" ]
              }
            },
            "filter": {
              "test_index01_synonym": {
                "type": "synonym",
                "synonyms_path": "analysis/synonyms.txt"
              }
            }
          }
        }
      }
    }
    GET /test_index01/_analyze
    {
      "text": "Mengdiudiu",
      "analyzer": "test_index01_synonym"
    }
    

第二种方式

DELETE test_index02
PUT /test_index02
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "test_index02_search_synonyms": {
            "tokenizer": "whitespace",
            "filter": [ "test_index02_graph_synonyms" ]
          }
        },
        "filter": {
          "test_index02_graph_synonyms": {
            "type": "synonym_graph",
            "synonyms_path": "analysis/synonyms.txt"
          }
        }
      }
    }
  }
}
GET /test_index02/_analyze
{
  "text": "Mengdiudiu",
  "analyzer": "test_index02_search_synonyms"
}

自定义切词器,分析器

DELETE test_index03
PUT /test_index03
{
  "settings": {
    "analysis": {
      "char_filter": {
        // 自定义char_filter: 转换单词
        "test_myfilter03": {
          "type": "mapping",
          "mappings": ["& => and", "| => or"]
        }
        // 可以定义多个char_filter,其余的是否可以定义多个可以尝试
      },
      "filter": {
        // 自定义过滤器: 过滤停用词
        "test_mystop01":{
          "type": "stop",
          "stopwords": ["is", "the"]
        }
      },
      "tokenizer": {
        // 自定义切词器
        "test_mytokenizer01":{
          "type": "pattern",
          "pattern": "[.,!? ]"
        }
      },
      "analyzer": {
        // 自定义分析器
        "test_myanalyzer01": {
          // 分词器类型,自定义
          "type": "custom",
          "char_filter": ["test_myfilter03"],
          "tokenizer": "test_mytokenizer01",
          "filter": ["test_mystop01","lowercase"]
          
        }
      }
    }
  }
}
GET test_index03/_analyze
{
  // 使用自定义的analyzer
  "analyzer": "test_myanalyzer01",
  "text": "is,the.New? Apple! & |"
}

常用分词器

中文分词器

已定义分词器

词库热更新

如果每次更新词库都要重启服务这是生产环境无法忍受的.

所以现在支持热更新;

使用方式就是配置IK config文件的remote_ext_dict的url地址进行热更新(默认是location)

具体的热更新见IK github说明

https://github.com/medcl/elasticsearch-analysis-ik文章来源地址https://www.toymoban.com/news/detail-518798.html

热更新的坑
  • 你本地启动的服务只是告诉es要不要更新,并不是由这个服务返回最新内容,即最终reload操作还是es node从自己本地目录去加载
  • node 对应的停用词文件, 分词文件必须有,理由见第一条.
  • 停用词和分词文件目录一定要放对plugins/ik/config/custome, 一定要在ik的config内,它是相对这里的, 其他地方不生效,除非配置绝对路径
  • 正更新流程是这样的: 修改各个node本地文件-> 三方服务告诉es需要更新->es reload本地文件

到了这里,关于Elasticsearch 分词器切词器分析器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch:搜索及索引分析器

    在我之前的文章 “Elasticsearch: analyzer”,我详细介绍了在 Elasticsearch 中的分析器。分析器在 Elasticsearh 中,它在索引文档的时候需要使用,同时,它也在搜索时,也需要针对搜索的文字进行分词。在今天的文章中,我们来详细介绍分析器是如何在索引及搜索时使用的。 可以在

    2024年02月05日
    浏览(82)
  • ElasticSearch 基础(七)之分析器

    就 ES 基础部分来说这暂时就是最后一篇的文章,写完之后就会学习 MQ 了。本篇内容简单了解 ES 的分析器,最重要的还是根据自己需求去定制自定义分析器,自定义分析器自行了解,这里只是基础。其他比较重要的就是中文分词器了,只需要知道常用的几种中文分词器就可以

    2024年02月09日
    浏览(38)
  • ElasticSearch系列 - SpringBoot整合ES:ElasticSearch分析器

    1. ElasticSearch match 文本搜索的过程? Elasticsearch 的 match 查询是一种基于文本匹配的查询方式,它的搜索过程如下: ① 将查询字符串分词:Elasticsearch 会将查询字符串分成一个个词项(term),并去除停用词(如“的”、“是”等常用词汇)和标点符号等无意义的字符。 ② 构建

    2023年04月18日
    浏览(120)
  • ElasticSearch系列 - SpringBoot整合ES:分析器

    1. ElasticSearch match 文本搜索的过程? Elasticsearch 的 match 查询是一种基于文本匹配的查询方式,它的搜索过程如下: ① 将查询字符串分词:Elasticsearch 会将查询字符串分成一个个词项(term),并去除停用词(如“的”、“是”等常用词汇)和标点符号等无意义的字符。 ② 构建

    2024年02月06日
    浏览(56)
  • Elasticsearch:Standard Text Analyzer - 标准文本分析器

    Elasticsearch 提供了超过很多开箱即用的分析器,我们可以在文本分析阶段使用它们。 这些分析器很可能足以满足基本情况,但如果需要创建自定义分析器,可以通过使用构成该模块的所需组件实例化一个新的分析器模块来实现。 下表列出了 Elasticsearch 为我们提供的分析器:

    2023年04月26日
    浏览(94)
  • 词法分析器(c++)

    个人觉得单纯是用来完成实验报告的话还行,但仅做参考,因为本人的编程水平有限,怕误人子弟。 本次代码支持以下操作: 单行注释 多行注释 文件形式输入 种别码可以在文件中自由修改 单词字符串识别支持: 部分(可手动在程序外部---reference.txt文件添加,),

    2024年02月04日
    浏览(46)
  • 编译原理———词法分析器

    设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解。 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。其中,  syn为单词种别码。  Token为存放的单词自身字符串。  Sum为整型常量。 具体实现时,可以将单词的二

    2024年02月08日
    浏览(56)
  • 分析器:常见问题

    源生成器(增量生成器)由于它特殊的定位,关于它的调试十分困难。在这里分享一些调试它的经验。 另外经常有写类库,然后提供可以生成代码的Attribute给用户的需求,此时需要用到传递引用的知识点。 源生成器项目和普通的项目不同。 普通的会在你按下运行或调试后才

    2024年02月01日
    浏览(65)
  • 词法分析器的设计与实现

    1.1、实验目的         加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 1.2、实验要求         1)对单词的构词规则有明确的定义;      

    2024年02月13日
    浏览(49)
  • Lex 生成一个词法分析器

     lex 通过输入一个.l 文件生成一个lex.yy.c 文件,然后通过c 编译器编译成一个可执行的词法分析器。 该词法分析器扫描输入源文件,生成一个token 符号流给后面语法分析器使用。   .l 文件的结构, 分成三个部分,声明, 转换规则, 自定义规则。 三个部分由%%分割 声明段,

    2024年02月19日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包