tnblog
首页
视频
资源
登录

Elasticsearch 多字段特性及Mapping中配置自定义Analyzer

8330人阅读 2020/11/3 10:41 总访问:3659363 评论:0 收藏:0 手机
分类: 云产品

elasticsearch

Elasticsearch 多字段特性及Mapping中配置自定义Analyzer

多字段类型

多字段特性

厂家名字可以实现精确匹配,增加一个 keyword 子字段

使用不同的analyzer

  1. 使用不同的语言进行搜索
  2. 也可以使用拼音字段的搜索
  3. 还支持为搜索和索引指定不通的 analyzer

增加子字段的特点,可以为该词有不同语言和语法上的查询

Exact Values vs Full Text(精确值与纯文本)

Exact Values (精确值) (keyword)

Exact Value:包括数字 / 日期 / 具体一个字符串。一般可以做商品名(例如“Apple Store”)

Full Text(纯文本)(text)

Full Text:非结构化文本数据

Exact Values 不需要被分词

Elasticsearch 为每一个字段创建一个倒排索引,Exact Value 在索引时,不需要做成特殊的分词处理
例如:

自定义分词器

当 Elasticsearch 自带的分词器无法满足时,可以自定义分词器。通过自组合不同的组件实现(例如以下3个分词过滤组件)

  • Character Filter
  • Tokenizer
  • Token Filter

Character Filters

在 Tokenizer 之前对文本进行处理,例如增加删除及替换字符串。可以配置多个Character Filters。会影响 Tokenizer 的 position 和 offset 信息。
一些自带的 Character Filters 有:

  • HTML strip - 去除 html 标签

    1. #不做分词处理的tokenizer
    2. #char_filter 中html_strip把html元素给剥离掉了
    3. POST _analyze
    4. {
    5. "tokenizer":"keyword",
    6. "char_filter":["html_strip"],
    7. "text": "<b>hello world</b>"
    8. }

    结果:

    1. {
    2. "tokens" : [
    3. {
    4. "token" : "hello world",
    5. "start_offset" : 3,
    6. "end_offset" : 18,
    7. "type" : "word",
    8. "position" : 0
    9. }
    10. ]
    11. }
  • Mapping - 字符串替换

    1. #使用char filter进行替换
    2. #这里将文本中的-替换成_
    3. POST _analyze
    4. {
    5. "tokenizer": "standard",
    6. "char_filter": [
    7. {
    8. "type" : "mapping",
    9. "mappings" : [ "- => _"]
    10. }
    11. ],
    12. "text": "123-456, I-test! test-990 650-555-1234"
    13. }

    结果:

  • 还可以替换表情哟!比如下面的代码我将:>换成happy,:<换成sad嘻嘻嘻。。。

    1. //char filter 替换表情符号
    2. POST _analyze
    3. {
    4. "tokenizer": "standard",
    5. "char_filter": [
    6. {
    7. "type" : "mapping",
    8. "mappings" : [ ":> => happy", ":< => sad"]
    9. }
    10. ],
    11. "text": ["I am felling :>", "Feeling :< today"]
    12. }

    结果:

  • Pattern replace - 正则匹配替换 (这里我们通过正则去掉http://)

    1. //正则表达式
    2. GET _analyze
    3. {
    4. "tokenizer": "standard",
    5. "char_filter": [
    6. {
    7. "type" : "pattern_replace",
    8. "pattern" : "http://(.*)",
    9. "replacement" : "$1"
    10. }
    11. ],
    12. "text" : "http://www.elastic.co"
    13. }

    结果:

Tokenizer

  • 将原始的文本按照一定的规则,切分为词(term or token)
  • Elasticsearch 内置的 Tokenizers
    • whitespace / standard / uax_url_email / patterm /keyword /path hierarchy
  • 可以用 Java 开发插件,实现自己的 Tokenizer

Token Filters

whitespace类型分词器,主要是针对于空格进行分词,但除此之外还有其他自带但Token Filters

  • 将 Tokenizer 输出的单词(term),进行增加,修改,删除
  • 自带的 Token Filters
    • Lowercase / stop / synonym (添加近义词)
名称 描述
stop 小写后常规介词给去掉
snowball 把词不同时态变为原型
lowercase 把词变成小写

path_hierarchy分词器基于路径进行拆分的分词器

  1. POST _analyze
  2. {
  3. "tokenizer":"path_hierarchy",
  4. "text":"/user/ymruan/a/b/c/d/e"
  5. }

结果:

  1. // white space and snowball
  2. GET _analyze
  3. {
  4. "tokenizer": "whitespace",
  5. "filter": ["stop","snowball"],
  6. "text": ["The gilrs in China are played this game!"]
  7. }
  8. // whitespacestop
  9. GET _analyze
  10. {
  11. "tokenizer": "whitespace",
  12. "filter": ["stop","snowball"],
  13. "text": ["The rain in Spain falls mainly on the plain."]
  14. }
  15. //remove 加入lowercase后,The被当成 stopword删除
  16. GET _analyze
  17. {
  18. "tokenizer": "whitespace",
  19. "filter": ["lowercase","stop","snowball"],
  20. "text": ["The gilrs in China are playing this game!"]
  21. }

结果(1):

结果(2):

结果(3):

自定义分词器

  1. 自定义分析器标准格式是:
  2. PUT /my_index
  3. {
  4. "settings": {
  5. "analysis": {
  6. "char_filter": { ... custom character filters ... },//字符过滤器
  7. "tokenizer": { ... custom tokenizers ... },//分词器
  8. "filter": { ... custom token filters ... }, //词单元过滤器
  9. "analyzer": { ... custom analyzers ... }
  10. }
  11. }
  12. }
  1. PUT my_index
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_custom_analyzer" : {
  7. "type": "custom",
  8. "char_filter":[
  9. "emoticons"
  10. ],
  11. "tokenizer":"punctuation",
  12. "filter":[
  13. "lowercase",
  14. "english_stop"
  15. ]
  16. }
  17. },
  18. "tokenizer": {
  19. "punctuation": {
  20. "type" : "pattern",
  21. "pattern" : "[ .,!?]"//有个空格
  22. }
  23. },
  24. "char_filter": {
  25. "emoticons": {
  26. "type" : "mapping",
  27. "mappings" : [ ":) => _happy_", ":( => _sad_"]
  28. }
  29. },
  30. "filter": {
  31. "english_stop" : {
  32. "type" : "stop",
  33. "stopwords" : "_english_"
  34. }
  35. }
  36. }
  37. }
  38. }

使用一下

  1. POST my_index/_analyze
  2. {
  3. "analyzer": "my_custom_analyzer",
  4. "text": "I'm a :) person, and you"
  5. }

结果


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Elasticsearch 安装与部署

Elasticsearch 安装与部署[TOC] 环境准备 Java 8.0以上的环境本机环境为Mac,Java 14.0.2 获取 Elasticsearch 安装包 ...

Docker运行 Elasticsearch Kibana和Cerebro

Docker运行 Elasticsearch Kibana和Cerebro[TOC] Demo 运行 Docker-compose,本地构建更高效的开发环境,更直观地了解 El...

Elasticsearch 基本概念:索引、文档和REST API

Elasticsearch 基本概念:索引、文档和REST API[TOC] 前言 为了了解 Elasticsearch 如何构成,我们首先需要理解索引(I...

Elasticsearch 基本概念:节点、集群、分片及副本

Elasticsearch 基本概念:节点、集群、分片及副本[TOC] 分布式系统的可用性与扩展性 高可用性 服务可用性 - 允许有节...

Elasticsearch 文档的基本CRUD与批量操作

Elasticsearch 文档的基本CRUD与批量操作[TOC] 文档的 CRUD Index PUT my_index/_doc/1 {“user”:...

Elasticsearch 倒排索引(运用Analyzer进行分词)

Elasticsearch 倒排索引[TOC] 正排与倒排索引 我们以一本书为例子,一本书的目录为正排索引,它将排列整本书的主要大纲...

Elasticsearch Search API概览

Elasticsearch Search API概览[TOC] Search API 通过搜索获取的数据方式有两种。 URL Search 在URL中使用查询参数...

Elasticsearch URL Search详解

Elasticsearch URL Search详解[TOC] 通过 URL Query 实现搜索举例: Get /movies/_search?q=2020&amp;df=title&amp;sort...

Elasticsearch Request Body与Query DSL简介

Elasticsearch Request Body与Query DSL简介[TOC] Request Body Search 将查询语句通过 HTTP Resquest Body 发送给 Ela...

Elasticsearch 显式Mapping设置与常见参数介绍

Elasticsearch 显式Mapping设置与常见参数介绍[TOC] 如何显示的定义一个MappingPut movies { &quot;mappings&quot; ...

Elasticsearch Index Template 和 Dynamic Template

Elasticsearch Index Template和Dynamic Template[TOC] 什么是 Index Template 可以通过一定的规则去设定 Mappings 和 Se...

Elasticsearch 聚合分析简介

Elasticsearch 聚合分析简介[TOC] 什么是聚合(Aggregation) 聚合:对有关的数据进行内容挑选、分析、归类(筛选),最...

Elasticsearch 基于词项和基于全文的搜索

Elasticsearch 基于词项和基于全文的搜索[TOC] 基于 Term 的查询Term 的重要性Term 是表达语意的最小单位。搜索和利用语言...

.NET Core使用Elasticsearch 一:windows安装Elasticsearch与kibana

一:安装java环境ElasticSearch是基于Java的所以先要安装Java,dkj,当然下载的ElasticSearch也带得也jkd也可以使用那个。下...

.NET Core使用Elasticsearch 二:CORE操作ES基础环境与简单查询

Elasticsearch使用版本7.12.0安装Elasticsearch与kibana可以参考:https://www.tnblog.net/aojiancc2/article/details/5875...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术