美文网首页elasticsearch
ElasticSearch(六):分词

ElasticSearch(六):分词

作者: 采风JS | 来源:发表于2018-11-22 12:35 被阅读31次

    一 分词器

    • Character Filter
      针对原始文本进行处理,比如去除html特殊标记符;
    • Tokenized
      将原始文本按照一切规则切分单词;
    • Token Filter
      针对tokenizer处理的单词进行加工,比如转换小写等;

    二 Analyze API

    • analyze api
      常用来测试/验证分词效果
    ##直接指定analyzer进行测试
    POST _analyze
    {
      "analyzer": "standard",
      "text":"The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
    }
    ##直接指定索引中的字段进行测试
    POST test_index/_analyze
    {
      "field": "username",
      "text":"hello world!"
    }
    ##自定义分词器进行测试
    POST _analyze
    {
      "tokenizer": "standard",
      "filter":  [ "lowercase" ,"shingle","reverse"],
     "text":"a beauty Hello World!"
    }
    

    三 自带分词器

    Standard Analyzer: 默认分词器,按次切分,小写处理;
    Simple Analyzer: 按照非字母切分,小写处理;
    Whitespace Analyzer: 按照空格进行切分;
    Stop Analyzer:Stop Word指语气助词等修饰性的词语,比如the/an等,比Simple Analyzer多了个Stop Word;
    Keyword Analyzer:不分词,直接将输入作为一个单词输出;
    Pattern Analyzer:通过正则表达式自定义分隔符,默认时\W+,即非字词的符号作为分隔符;
    Langauge Analyzer:提供30+常见语言的分词器;
    

    四 自定义分词

    PUT test_index_1
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_custom_analyzer": {
              "type":      "custom",
              "tokenizer": "standard", ##标准
              "char_filter": [
                "html_strip"
              ],
              "filter": [
                "lowercase",
                "asciifolding"
              ]
            }
          }
        }
      }
    }
    POST test_index_1/_analyze
    {
      "analyzer": "my_custom_analyzer",
      "text": "Is this <b>a box</b>?"
    }
    
    PUT test_index_2
    {
      "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_"
            }
          }
        }
      }
    }
    POST test_index_2/_analyze
    {
      "analyzer": "my_custom_analyzer",
      "text":     "I'm a :) person, and you?"
    }
    

    五 倒排索引

    倒排索引是搜索引擎的核心,主要包含两部分,分别是单词词典和倒排列表;

    • 单词词典
    1-记录所有文档的单词,一般都比较大;
    2-记录单词到倒排列表的关联信息;
    3-单词字典的实现一般是B+ Tree;
    
    • 倒排列表
      记录单词对应的文档集合,由倒排索引项组成;
    1-文档Id,用于获取原始信息;
    2-单词频率(TF,Term Frequency),记录单词在文档中的出现次数,用于相关性算分;
    3-位置(Position),记录单词在文档中的分词位置,用于做词语搜索;
    4-偏移(Offset), 记录单词在文档中的开始和结束位置,用于高亮显示;
    
    • Segment
      单个倒排索引称为segment,合并在一起称为一个Index,即一个shard,shard中通过commit point记录所有的segment;
    倒排索引文件一旦生成,不可更改;
    优势:
    1-不考虑并发写文件问题,杜绝锁机制带来的性能问题;
    2-利用不可更改性,只需载入一次;
    3-利于对文件进行压缩,节省磁盘空间;
    劣势:
    1-添加新文档时,必须重建倒排索引文件,替换旧文件;
    方案:
    1-添加新文档时,生成新的倒排索引文件,查询时同时查询所有的倒排索引文件,做结果汇总即可;
    补充:
    1-ES中每个字段都有自己的倒排索引文件;
    

    相关文章

      网友评论

        本文标题:ElasticSearch(六):分词

        本文链接:https://www.haomeiwen.com/subject/atflqqtx.html