当前播放: 20 | 多字段特性及Mapping中配置自定义Analyzer
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
课程目录
第一章:概述 (4讲)
01 | 课程介绍
免费
02 | 内容综述及学习建议
免费
03 | Elasticsearch简介及其发展历史
免费
04 | Elastic Stack家族成员及其应用场景
免费
第二章:安装上手 (4讲)
05 | Elasticsearch的安装与简单配置
免费
06 | Kibana的安装与界面快速浏览
07 | 在Docker容器中运行Elasticsearch Kibana和Cerebro
08 | Logstash安装与导入数据
第三章:Elasticsearch入门 (15讲)
09 | 基本概念:索引、文档和REST API
10 | 基本概念:节点、集群、分片及副本
11 | 文档的基本CRUD与批量操作
12 | 倒排索引介绍
13 | 通过Analyzer进行分词
14 | Search API概览
15 | URI Search详解
16 | Request Body与Query DSL简介
17 | Query String&Simple Query String查询
18 | Dynamic Mapping和常见字段类型
19 | 显式Mapping设置与常见参数介绍
20 | 多字段特性及Mapping中配置自定义Analyzer
21 | Index Template和Dynamic Template
22 | Elasticsearch聚合分析简介
23 | 第一部分总结
第四章:深入搜索 (13讲)
24 | 基于词项和基于全文的搜索
25 | 结构化搜索
26 | 搜索的相关性算分
27 | Query&Filtering与多字符串多字段查询
28 | 单字符串多字段查询:Dis Max Query
29 | 单字符串多字段查询:Multi Match
30 | 多语言及中文分词与检索
31 | Space Jam,一次全文搜索的实例
32 | 使用Search Template和Index Alias查询
33 | 综合排序:Function Score Query优化算分
34 | Term&Phrase Suggester
35 | 自动补全与基于上下文的提示
36 | 配置跨集群搜索
第五章:分布式特性及分布式搜索的机制 (8讲)
37 | 集群分布式模型及选主与脑裂问题
38 | 分片与集群的故障转移
39 | 文档分布式存储
40 | 分片及其生命周期
41 | 剖析分布式查询及相关性算分
42 | 排序及Doc Values&Fielddata
43 | 分页与遍历:From, Size, Search After & Scroll API
44 | 处理并发读写操作
第六章:深入聚合分析 (4讲)
45 | Bucket & Metric聚合分析及嵌套聚合
46 | Pipeline聚合分析
47 | 作用范围与排序
48 | 聚合分析的原理及精准度问题
第七章:数据建模 (7讲)
49 | 对象及Nested对象
50 | 文档的父子关系
51 | Update By Query & Reindex API
52 | Ingest Pipeline & Painless Script
53 | Elasticsearch数据建模实例
54 | Elasticsearch数据建模最佳实践
55 | 第二部分总结回顾
第八章:保护你的数据 (3讲)
56 | 集群身份认证与用户鉴权
57 | 集群内部安全通信
58 | 集群与外部间的安全通信
第九章:水平扩展Elasticsearch集群 (6讲)
59 | 常见的集群部署方式
60 | Hot & Warm架构与Shard Filtering
61 | 分片设计及管理
62 | 如何对集群进行容量规划
63 | 在私有云上管理Elasticsearch集群的一些方法
64 | 在公有云上管理与部署Elasticsearch集群
第十章:生产环境中的集群运维 (10讲)
65 | 生产环境常用配置与上线清单
66 | 监控Elasticsearch集群
67 | 诊断集群的潜在问题
68 | 解决集群Yellow与Red的问题
69 | 提升集群写性能
70 | 提升进群读性能
71 | 集群压力测试
72 | 段合并优化及注意事项
73 | 缓存及使用Breaker限制内存使用
74 | 一些运维的相关建议
第十一章:索引生命周期管理 (2讲)
75 | 使用Shrink与Rollover API有效管理时间序列索引
76 | 索引全生命周期管理及工具介绍
第十二章:用Logstash和Beats构建数据管道 (3讲)
77 | Logstash入门及架构介绍
78 | 利用JDBC插件导入数据到Elasticsearch
79 | Beats介绍
第十三章:用Kibana进行数据可视化分析 (4讲)
80 | 使用Index Pattern配置数据
81 | 使用Kibana Discover探索数据
82 | 基本可视化组件介绍
83 | 构建Dashboard
第十四章:探索X-Pack套件 (6讲)
84 | 用Monitoring和Alerting监控Elasticsearch集群
85 | 用APM进行程序性能监控
86 | 用机器学习实现时序数据的异常检测(上)
87 | 用机器学习实现时序数据的异常检测(下)
88 | 用ELK进行日志管理
89 | 用Canvas做数据演示
实战1:电影搜索服务 (3讲)
90 | 项目需求分析及架构设计
91 | 将电影数据导入Elasticsearch
92 | 搭建你的电影搜索服务
实战2:Stackoverflow用户调查问卷分析 (3讲)
93 | 需求分析及架构设计
94 | 数据Extract & Enrichment
95 | 构建Insights Dashboard
备战:Elastic认证 (5讲)
96 | Elastic认证介绍
97 | 考点梳理
98 | 集群数据备份
99 | 基于Java和Elasticseach构建应用
100 | 结束语
20 | 多字段特性及Mapping中配置自定义Analyzer

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

阮一鸣
eBay Pronto平台技术负责人
100讲 约1000分钟16687
单独订阅¥129
2人成团¥99
13
登录 后留言

精选留言(39)

  • Sunqc
    去官网看了一下,自定义分析器标准格式是:
    PUT /my_index
    {
        "settings": {
            "analysis": {
                "char_filter": { ... custom character filters ... },//字符过滤器
                "tokenizer": { ... custom tokenizers ... },//分词器
                "filter": { ... custom token filters ... }, //词单元过滤器
                "analyzer": { ... custom analyzers ... }
            }
        }
    }
    ============================实例===========================
    PUT /my_index
    {
        "settings": {
            "analysis": {
                "char_filter": {
                    "&_to_and": {
                        "type": "mapping",
                        "mappings": [ "&=> and "]
                }},
                "filter": {
                    "my_stopwords": {
                        "type": "stop",
                        "stopwords": [ "the", "a" ]
                }},
                "analyzer": {
                    "my_analyzer": {
                        "type": "custom",
                        "char_filter": [ "html_strip", "&_to_and" ],
                        "tokenizer": "standard",
                        "filter": [ "lowercase", "my_stopwords" ]
                }}
    }}}


    ============================实例===========================
    比如自定义好的analyzer名字是my_analyzer,在此索引下的某个新增字段应用此分析器
    PUT /my_index/_mapping
    {
       "properties":{
            "username":{
                 "type":"text",
                  "analyzer" : "my_analyzer"
             },
            "password" : {
              "type" : "text"
            }
        
      }
    }
    =================插入数据====================
    PUT /my_index/_doc/1
    {
      "username":"The quick & brown fox ",
       "password":"The quick & brown fox "


    }
    ====username采用自定义分析器my_analyzer,password采用默认的standard分析器==
    ===验证
    GET /index_v1/_analyze
    {
      "field":"username",
      "text":"The quick & brown fox"
    }

    GET /index_v1/_analyze
    {
      "field":"password",
      "text":"The quick & brown fox"
    }
    //官网权威指南是真的讲得好,虽然版本太老,Elasticsearch 2.x 版本,一些api已经不适用了,自定义分析器地址:https://www.elastic.co/guide/cn/elasticsearch/guide/cn/custom-analyzers.html

    作者回复: 👍

    2019-07-26
    10
  • Edwin
    少看一个空格,执行结果就不一致咯
    PUT my_index
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_custom_analyzer" : {
              "type": "custom",
              "char_filter":[
                "emoticons"
              ],
              "tokenizer":"punctuation",
              "filter":[
                "lowercase",
                "english_stop"
              ]
            }
          },
          "tokenizer": {
            "punctuation": {
              "type" : "pattern",
              "pattern" : "[ .,!?]"//有个空格
            }
          },
          "char_filter": {
            "emoticons": {
              "type" : "mapping",
              "mappings" : [ ":) => _happy_", ":( => _sad_"]
            }
          },
          "filter": {
            "english_stop" : {
              "type" : "stop",
              "stopwords" : "_english_"
            }
          }
        }
      }
    }

    作者回复: 👍

    2019-07-10
    1
    3
  • 小鱼
    老师,最后一个例子的代码在demo中没有呢,我自己手敲了一遍运行报错
    "reason": "unknown setting [index.char_filter.emoticons.mappings] please check that any required plugins are installed, or check the breaking changes documentation for removed settin
    2019-07-09
    1
    3
  • 氧气🌙 🐟 🌺
    PUT my_index
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_custom_analyzer" : {
              "type": "custom",
              "char_filter":[
                "emoticons"
              ],
              "tokenizer":"punctuation",
              "filter":[
                "lowercase",
                "english_stop"
              ]
            }
          },
          "tokenizer": {
            "punctuation": {
              "type" : "pattern",
              "pattern" : "[.,!?]" //少一个空格,就不会按照空格分词了
            }
          },
          "char_filter": {
            "emoticons": {
              "type" : "mapping",
              "mappings" : [ ":) => _happy_", ":( => _sad_"]
            }
          },
          "filter": {
            "english_stop" : {
              "type" : "stop",
              "stopwords" : "_english_"
            }
          }
        }
      }
    }


    {
      "tokens" : [
        {
          "token" : "i'm a _happy_ person",
          "start_offset" : 0,
          "end_offset" : 15,
          "type" : "word",
          "position" : 0
        },
        {
          "token" : " and you",
          "start_offset" : 16,
          "end_offset" : 24,
          "type" : "word",
          "position" : 1
        }
      ]
    }
    2019-08-17
    1
    2
  • 我将带头冲锋
    老师,认真的敲了一遍您的demo,发现最后一个案例里的"stopwords":"_english_",这句话去掉之后,执行的结果一样,所以这句话的作用是什么想请教一下。?猜测:是碰到_(英文单词)_就是停用词吗,可是_happy_并没有被停用啊?
    2019-09-22
    1
    1
  • 暖色浮余生
    提问,自定义的分词器如何添加字典啊,比如说我输入的是
    13370这个串。我要按照自己定义的词典分成 133和70两个词。谢谢老师😁
    2019-09-07
    1
  • Yang
    多字段的意思就是可以根据不同版本的定义来搜索同一个文档
    例如:
        "name": {
           "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
         }
    我们在搜索的时候可以根据name的关键字搜索到该文档,跟正常的一样,但是我们也可以使用name.keyword精确指定name的值来搜索到该文档。看Elasticsearch in action 这本书上是这样解释多字段的,分享给大家

    作者回复: 根据name的关键字?

    多字段可以对同样的文本使用不同的分词器,并且使用子字段进行查询

    2019-08-12
    1
    1
  • SirNicholas
    我使用的widows&linux你用个苹果电脑来操作。不同系统还是有很大差异的,有些命令区分你课程没有讲到的,应该在文档中注释一下,大家都是赚钱,不是天上掉下来的。你稍微注意点,我们也方便点。

    作者回复: 你好,你说的问题确实存在。例如,我没有讲解docker的安装的细节,只给出了相关的文档。docker其实并不是必须的,我只是希望能给提供大家一个拓展思维的方式。即便一下子设置不成功也不会影响后面的学习。

    ES的本机环境安装,应该还是比较简单的,按照文档上的步骤运行一下,一般都不会有什么问题。至于生产环境的配置,我们会给出一些相关的建议

    2019-07-09
    3
    1
  • 简简单单
    大家好, 请问我想在filter里面过滤掉 空格 该怎么写呢, 就是对字段进行搜索的时候不受空格的影响, 忽略掉空格, 但是搜索出来的字段数据, 有空格的还是有空格, 这个怎么做呢?
    2019-10-31
  • pl
    支持老师,讲的很好
    2019-10-28
  • 海沙画
    老师您好:
    请问standard analyzer分词器,为什么会将表情删除掉,和你的运行结果不一样
    //char filter 替换表情符号
    POST _analyze
    {
      "analyzer": "standard",
      "char_filter": [
          {
            "type":"mapping",
            "mappings":[ ":) => happy",":( => sad"]
          }
        ],
        "text": ["I am felling :)","Feeling :( today"]
    }

    运行结果
    {
      "tokens" : [
        {
          "token" : "i",
          "start_offset" : 0,
          "end_offset" : 1,
          "type" : "<ALPHANUM>",
          "position" : 0
        },
        {
          "token" : "am",
          "start_offset" : 2,
          "end_offset" : 4,
          "type" : "<ALPHANUM>",
          "position" : 1
        },
        {
          "token" : "felling",
          "start_offset" : 5,
          "end_offset" : 12,
          "type" : "<ALPHANUM>",
          "position" : 2
        },
        {
          "token" : "feeling",
          "start_offset" : 16,
          "end_offset" : 23,
          "type" : "<ALPHANUM>",
          "position" : 3
        },
        {
          "token" : "today",
          "start_offset" : 27,
          "end_offset" : 32,
          "type" : "<ALPHANUM>",
          "position" : 4
        }
      ]
    }
    2019-09-29
  • 踮脚时光
    最后一个案例里的"stopwords":"_english_"有什么用?如何测试能看出生效呢
    2019-09-27
  • 码农Kevin亮
    请问老师,课程中提到的这些es的用法,在哪里可以找到具体的文档说明?麻烦分享下地址,谢谢

    作者回复: 我每一节demo 都写在readme 中,你贴到kibana的dev tool,在那个语句上,在
    mac上按下cmd➕/ 就能跳到api 文档,其他系统的快捷键 你在kibana上查一下快捷键

    2019-09-25
  • 拾光
    老师,我想问下最后一个案例中"stopwords" : "_english_"是什么意思,有没有这行代码结果都是一样的呀,这个也没有去除_happy_这样的单词啊。
    "filter": {
            "english_stop" : {
              "type" : "stop",
              "stopwords" : "_english_"
            }
    2019-09-24
  • godtrue
    课后思考及问题
    1:分析器的大体执行过程
    char filter - >tokenizer -> token filter
    2:分词的时机
    分词在索引时做,也就是数据写入时。目的是创建倒排索引提高搜索速度。写入的原始数据保存在_source中
    老师,ES添加文档的时候需要做的事情比较多,比如:分词、创建倒排索引、数据落盘、数据同步等,速度会比较慢,如果数据量多会更慢,那针对这个怎么判断慢的是否合理?如果不合理有什么定位和排查的思路呢?另外,倒排索引会创建几个,类似MySQL一个索引一棵索引树嘛?
    2019-09-19
  • 疯琴
    每节课都把demo手敲一遍,收获很大,谢谢老师。

    作者回复: 嗯 结合kibana的自动提示功能,加上cmd➕斜杠查看文档的功能。代码不需要死记,但是结构和场景一定要理解并记住

    2019-09-15
  • 石头剪刀布
    老师好。
    请问一下有没有好的去掉所有特殊字符的实践?
    我看了下好像没有这种char_filter。
    这里的特殊字符定义为“除了中文英文以外的所有特殊字符,包含像☆这种”
    2019-08-29
  • Cybertrunk
    try on 7.3, different analysis result below, and i think mine is right, cause you define the punctuation charactor for to tokenizer.
    {
      "tokens" : [
        {
          "token" : "i'm a _happy_ person",
          "start_offset" : 0,
          "end_offset" : 15,
          "type" : "word",
          "position" : 0
        },
        {
          "token" : " and you",
          "start_offset" : 16,
          "end_offset" : 24,
          "type" : "word",
          "position" : 1
        }
      ]
    }
    2019-08-26
    1
  • bruce
    按我的理解,分词是在搜索返回数据前做的,原先的数据是不会动的。分词是不是会影响搜索性能?

    作者回复: 分词在索引时做,也就是数据写入时。目的是创建倒排索引提高搜索速度。写入的原始数据保存在_source中

    2019-08-21
  • 正井猫
    挺喜欢老师的,每节课的时间虽然很短,但是内容很多,很清晰,我需要花很长的时间去消化理解,可能我是个小白吧,反正觉得很值当。谢谢老师。

    作者回复: 可以把课上的demo自己运行一下,能加深理解

    2019-08-21
收起评论
看过的人还看
Kafka核心技术与实战

胡夕  人人贷计算平台部总监,Apache Kafka Contributor

46讲 | 8487 人已学习

拼团 ¥79 原价 ¥99
从0开始学架构

李运华  资深技术专家

59讲 | 39040 人已学习

¥99
趣谈网络协议

刘超  网易研究院云计算技术部首席架构师

51讲 | 39723 人已学习

拼团 ¥79 原价 ¥99
MySQL实战45讲

林晓斌  网名丁奇,前阿里资深技术专家

48讲 | 43446 人已学习

¥99