ElasticSearch - 自定义分析器

  • ElasticSearch的分析器实际上是将三个功能封装在一起,这三个功能按照顺序执行,而这三个功能都是能自定义的

    • 字符过滤器 (char_filter)

      • 首先,字符串按顺序通过每个字符过滤器,他们的任务是在分词前整理字符串

      • 一个字符过滤器可以用来去掉HTML,或者将&转化成and

    • 分词器 (tokenizer)

      • 其次,字符串被分词器分爲单个的词条,一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条

      • Hello how are you?会被ES预设的分词器standard分成hellohowareyou

    • Token 过滤器 (filter)

      • 最后,词条按顺序通过每个 token 过滤器,这个过程可能会改变词条(Quick -> quick)、删除词条(a、an、and、the...)、增加词条(jump和leap这种同义词)

  • 自定义分析器

    • 格式

      PUT 127.0.0.1:9200/mytest
      {
          "setting": {
              "analysis": {
                  "char_filter": { 自定义的字符过滤器 },
                  "tokenizer": { 自定义的分词器 },
                  "filter": { 自定义的token过滤器 },
                  "analyzer": { 自定义的分析器,可以将上面的char_filter、tokenizer、filter用不同的组合拼起来,形成不同的分析器 }
              }
          }
      }
    • 具体实例

      PUT 127.0.0.1:9200/mytest
      {
          "settings": {
              "analysis": {
                  "char_filter": {
                      "&_to_and": {
                          "type": "mapping",
                          "mappings": ["&=> and "]
                      },
                      "xxx": {....},
                      "yyy": {....}
                  },
                  "filter": {
                      "my_stopwords": {
                          "type": "stop",
                          "stopwords": ["the", "a"]
                      }
                  },
                  "analyzer": {
                      //自定义分析器,将想要的char_filter、tokenizer、filter给加载进来
                      "my_analyzer": {
                          "type": "custom",
                          "char_filter": ["htmp_strip", "&_to_and"], //数组顺序很重要,因为是照顺序执行,先执行htmp_strip,再执行&_to_and,然后才去执行tokenizer
                          "tokenizer": "standard",
                          "filter": ["lowercase", "my_stopwords"]
                      }
                  }
              }
          },
          "mappings": {
              "doc": {
                  "properties": {
                      "nickname": { 
                          "type": "text",
                          "analyzer": "my_analyzer" //使用自定义的分析器
                      }
                  }
              }
          }
      }
  • 控制分析器 search_analyzer、analyzer

    • 分析器主要有两种情况会被使用,一种是插入文档时,将text类型的字段做分词然后插入倒排索引,第二种就是在查询时,先对要查询的text类型的输入做分词,再去倒排索引搜索

    • 如果想要让 索引 和 查询 时使用不同的分词器,ElasticSearch也是能支持的,只需要在字段上加上search_analyzer参数

      • 在索引时,只会去看字段有没有定义analyzer,有定义的话就用定义的,没定义就用ES预设的

      • 在查询时,会先去看字段有没有定义search_analyzer,如果没有定义,就去看有没有analyzer,再没有定义,才会去使用ES预设的

    • 具体实例

      PUT 127.0.0.1:9200/mytest
      {
          "mappings": {
              "doc": {
                  "properties": {
                      "nickname": { 
                          "type": "text",
                          "analyzer": "standard",  //索引时使用standard分词器
                          "search_analyzer": "simple" //查询时使用simple分词器
                      },
                      "name": {
                          "type": "text",
                          "analyzer": "standard" //索引和查询都使用standard分词器
                      }
                  }
              }
          }
      }

猜你喜欢

转载自blog.csdn.net/weixin_40341116/article/details/80630812