下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 20 | 多字段特性及Mapping中配置自定义Analyzer
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

Elasticsearch核心技术与实战

共100讲 · 约1000分钟
16516
免费
01 | 课程介绍
免费
02 | 内容综述及学习建议
免费
03 | Elasticsearch简介及其发...
免费
04 | Elastic Stack家族成员及...
免费
05 | Elasticsearch的安装与...
06 | Kibana的安装与界面快速...
07 | 在Docker容器中运行Elas...
08 | Logstash安装与导入数据
09 | 基本概念:索引、文档和...
10 | 基本概念:节点、集群、分...
11 | 文档的基本CRUD与批量操...
12 | 倒排索引介绍
13 | 通过Analyzer进行分词
14 | Search API概览
15 | URI Search详解
16 | Request Body与Query ...
17 | Query String&Simple ...
18 | Dynamic Mapping和常见...
19 | 显式Mapping设置与常见参...
20 | 多字段特性及Mapping中配...
21 | Index Template和Dynami...
22 | Elasticsearch聚合分析简...
23 | 第一部分总结
24 | 基于词项和基于全文的搜索
25 | 结构化搜索
26 | 搜索的相关性算分
27 | Query&Filtering与多字...
28 | 单字符串多字段查询:Dis...
29 | 单字符串多字段查询:Mult...
30 | 多语言及中文分词与检索
31 | Space Jam,一次全文搜索...
32 | 使用Search Template和In...
33 | 综合排序:Function Scor...
34 | Term&Phrase Suggester
35 | 自动补全与基于上下文的提...
36 | 配置跨集群搜索
37 | 集群分布式模型及选主与脑...
38 | 分片与集群的故障转移
39 | 文档分布式存储
40 | 分片及其生命周期
41 | 剖析分布式查询及相关性算...
42 | 排序及Doc Values&Field...
43 | 分页与遍历:From, Siz...
44 | 处理并发读写操作
45 | Bucket & Metric聚合分...
46 | Pipeline聚合分析
47 | 作用范围与排序
48 | 聚合分析的原理及精准度问...
49 | 对象及Nested对象
50 | 文档的父子关系
51 | Update By Query &...
52 | Ingest Pipeline & Pa...
53 | Elasticsearch数据建模实...
54 | Elasticsearch数据建模最...
55 | 第二部分总结回顾
56 | 集群身份认证与用户鉴权
57 | 集群内部安全通信
58 | 集群与外部间的安全通信
59 | 常见的集群部署方式
60 | Hot & Warm架构与Shard...
61 | 分片设计及管理
62 | 如何对集群进行容量规划
63 | 在私有云上管理Elasticsea...
64 | 在公有云上管理与部署Elas...
65 | 生产环境常用配置与上线清...
66 | 监控Elasticsearch集群
67 | 诊断集群的潜在问题
68 | 解决集群Yellow与Red的问...
69 | 提升集群写性能
70 | 提升进群读性能
71 | 集群压力测试
72 | 段合并优化及注意事项
73 | 缓存及使用Breaker限制内...
74 | 一些运维的相关建议
75 | 使用Shrink与Rollover AP...
76 | 索引全生命周期管理及工具...
77 | Logstash入门及架构介绍
78 | 利用JDBC插件导入数据到El...
79 | Beats介绍
80 | 使用Index Pattern配置数...
81 | 使用Kibana Discover探索...
82 | 基本可视化组件介绍
83 | 构建Dashboard
84 | 用Monitoring和Alerting监...
85 | 用APM进行程序性能监控
86 | 用机器学习实现时序数据的...
87 | 用机器学习实现时序数据的...
88 | 用ELK进行日志管理
89 | 用Canvas做数据演示
90 | 项目需求分析及架构设计
91 | 将电影数据导入Elasticsea...
92 | 搭建你的电影搜索服务
93 | 需求分析及架构设计
94 | 数据Extract & Enrichm...
95 | 构建Insights Dashboard
96 | Elastic认证介绍
97 | 考点梳理
98 | 集群数据备份
99 | 基于Java和Elasticseach构...
100 | 结束语
本节摘要
展开

精选留言(39)

  • 2019-07-26
    去官网看了一下,自定义分析器标准格式是:
    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
    展开

    作者回复: 👍

    10
  • 2019-07-10
    少看一个空格,执行结果就不一致咯
    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_"
            }
          }
        }
      }
    }
    展开

    作者回复: 👍

    1
    3
  • 2019-07-09
    老师,最后一个例子的代码在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
    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
        }
      ]
    }
    展开
    1
    2
  • 老师,认真的敲了一遍您的demo,发现最后一个案例里的"stopwords":"_english_",这句话去掉之后,执行的结果一样,所以这句话的作用是什么想请教一下。?猜测:是碰到_(英文单词)_就是停用词吗,可是_happy_并没有被停用啊?
    1
    1
  • 2019-09-07
    提问,自定义的分词器如何添加字典啊,比如说我输入的是
    13370这个串。我要按照自己定义的词典分成 133和70两个词。谢谢老师😁
    1
  • 2019-08-12
    多字段的意思就是可以根据不同版本的定义来搜索同一个文档
    例如:
        "name": {
           "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
         }
    我们在搜索的时候可以根据name的关键字搜索到该文档,跟正常的一样,但是我们也可以使用name.keyword精确指定name的值来搜索到该文档。看Elasticsearch in action 这本书上是这样解释多字段的,分享给大家
    展开

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

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

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

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

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

    3
    1
  • 2019-10-31
    大家好, 请问我想在filter里面过滤掉 空格 该怎么写呢, 就是对字段进行搜索的时候不受空格的影响, 忽略掉空格, 但是搜索出来的字段数据, 有空格的还是有空格, 这个怎么做呢?
  • 2019-10-28
    支持老师,讲的很好
  • 2019-09-29
    老师您好:
    请问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-27
    最后一个案例里的"stopwords":"_english_"有什么用?如何测试能看出生效呢
  • 2019-09-25
    请问老师,课程中提到的这些es的用法,在哪里可以找到具体的文档说明?麻烦分享下地址,谢谢

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

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

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

  • 2019-08-29
    老师好。
    请问一下有没有好的去掉所有特殊字符的实践?
    我看了下好像没有这种char_filter。
    这里的特殊字符定义为“除了中文英文以外的所有特殊字符,包含像☆这种”
  • 2019-08-26
    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
        }
      ]
    }
    展开
    1
  • 2019-08-21
    按我的理解,分词是在搜索返回数据前做的,原先的数据是不会动的。分词是不是会影响搜索性能?

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

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

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