• Sunqc
    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
    展开

    作者回复: 👍

    
     12
  • Edwin
    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_"
            }
          }
        }
      }
    }
    展开

    作者回复: 👍

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

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

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

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

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

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

     3
     1
  • 公号:阿Q看世界
    2019-12-30
    我也按照老师的敲了一遍,最后有一个不一致,就是“I'm” 变成了 i 和 m,这是哪个的问题?
    
    
  • 简简单单
    2019-10-31
    大家好, 请问我想在filter里面过滤掉 空格 该怎么写呢, 就是对字段进行搜索的时候不受空格的影响, 忽略掉空格, 但是搜索出来的字段数据, 有空格的还是有空格, 这个怎么做呢?
    
    
  • pl
    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_"有什么用?如何测试能看出生效呢
    
    
  • 码农Kevin亮
    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_"
            }
    展开
    
    
  • godtrue
    2019-09-19
    课后思考及问题
    1:分析器的大体执行过程
    char filter - >tokenizer -> token filter
    2:分词的时机
    分词在索引时做,也就是数据写入时。目的是创建倒排索引提高搜索速度。写入的原始数据保存在_source中
    老师,ES添加文档的时候需要做的事情比较多,比如:分词、创建倒排索引、数据落盘、数据同步等,速度会比较慢,如果数据量多会更慢,那针对这个怎么判断慢的是否合理?如果不合理有什么定位和排查的思路呢?另外,倒排索引会创建几个,类似MySQL一个索引一棵索引树嘛?
    展开
    
    
  • 疯琴
    2019-09-15
    每节课都把demo手敲一遍,收获很大,谢谢老师。

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

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

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

    
    
我们在线,来聊聊吧