zoukankan      html  css  js  c++  java
  • 1.5.5 Tokenizers

    Tokenizers

    <fieldType name="text" class="solr.TextField">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory" />
            <filter class="solr.StandardFilterFactory" />
        </analyzer>
    </fieldType>

      Tokenizer的工厂类实现了org.apache.solr.analysis.TokenizerFactory.一个TokenizerFactory的create()方法接受一个Reader返回一个TokenStream.在solr创建tokenizer时,它传递一个流对象用于提供文本字段的内容.

      通过设置tokenizer的属性可以传递tokenizer的参数.

    <fieldType name="semicolonDelimited" class="solr.TextField">
        <analyzer type="query">
            <tokenizer class="solr.PatternTokenizerFactory" pattern="; " />
        </analyzer>
    </fieldType>

      下面描述了一些Tokenizer的工厂类的实现,具体可以参考 http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

    Standard Tokenizer

      标准分词器

      这个分词器将字段文本分解成tokens,主要处理作为分隔符的空格和标点符号.删除分割符号字符.具有一下异常处理:

    •   句号后边没有跟空格的话,将被当作token的一部分,包含互联网域名.
    •   "@"符号也作为了标准分词器的分割字符,所以email地址不能作为一个单独的token.

      注意:这个分词器可以拆分连接字符.

      这个分词器支持Unicode standard annex UAX#29单词,以<ALPHANUM>,<NUM>,<SOUTHEAST_ASIAN>,<IDEOGRAPHIC>和<HIRAGANA>这些token类型为边界.

      工厂类:solr.StandardTokenizerFactory

      参数:

        maxTokenLength:(integer 默认255),solr会忽略字符长度超过maxTokenLength的token.

      举例:

    <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory" />
    </analyzer>

      输入:"Please, email john.doe@foo.com by 03-09, re: m37-xq."

      输出:"Please", "email", "john.doe", "foo.com", "by", "03", "09", "re", "m37", "xq"

    Classic Tokenizer

      经典的分词器

      经典分词器包含solr3.1以及以前的标准分词器的相同的行为,但是它不使用Unicode standard annex UAX#29字的绑定规则(标准分词器所使用的规则).这个分词器将字段文本分解成tokens,主要处理作为分隔符的空格和标点符号.删除分割符号字符.具有一下异常处理:

    • 句号后边没有跟空格的话,将被当作token的一部分.
    • 以连接符拆分字.除非这个字里边有数字.这种情况下token是不拆分的,数字和连接符都会被保存.
    • 识别互联网域名和email地址,将它们作为一个token来处理.

      工厂类:solr.ClassicTokenizerFactory

      参数:maxTokenLength:(integer 默认255),solr会忽略字符长度超过maxTokenLength的token.

      举例:

    <analyzer>
        <tokenizer class="solr.ClassicTokenizerFactory" />
    </analyzer>

      输入:"Please, email john.doe@foo.com by 03-09, re: m37-xq."

      输出:"Please", "email", "john.doe@foo.com", "by", "03-09", "re", "m37-xq"

    Keyword Tokenizer

      关键词分词器

      这个分词器处理整个文本字段作为一个token.

      工厂类:solr.KeywordTokenizerFactory

      参数:None

      举例:

    <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory" />
    </analyzer>

      输入: "Please, email john.doe@foo.com by 03-09, re: m37-xq."

      输出: "Please, email john.doe@foo.com by 03-09, re: m37-xq."

    Letter Tokenizer

      字母分词器

      这个分词器从连续字母的字符串中创建tokens.抛弃一切非字母的字符.

      工厂类:solr.LetterTokenizerFactory

      参数:None

      举例:

    <analyzer>
        <tokenizer class="solr.LetterTokenizerFactory" />
    </analyzer>

      输入: "I can't."

      输出: "I", "can", "t"

    Lower Case Tokenizer

      小写分词器

      这个分词器以分字母字符为界限并且转换字母为小写.空格和非字母字符均被除去.

      工厂类:solr.LowerCaseTokenizerFactory

      参数:None

      举例:

    <analyzer>
        <tokenizer class="solr.LowerCaseTokenizerFactory" />
    </analyzer>

      输入: "I just  my iPhone!"

      输出: "i", "just", "love", "my", "iphone"

    N-Gram Tokenizer

      n分法分词器

      读取字段文本,生成给定范围大小的n-gram tokens.

      工厂类:solr.NGramTokenizerFactory

      参数:

        minGramSize:(integer 默认为1),最小n-gram大小必须>1.

        maxGramSize:(integer 默认为2),最大n-gram大小必须>=minGramSize.

      举例:

       注意:空格字符同样包含在编码中.

    <analyzer>
        <tokenizer class="solr.NGramTokenizerFactory" />
    </analyzer>

      输入: "hey man"

      输出: "h", "e", "y", " ", "m", "a", "n", "he", "ey", "y ", " m", "ma", "an"

      

      持有n-gram范围大小4-5的例子:

       注意:空格字符同样包含在编码中.

    <analyzer>
        <tokenizer class="solr.NGramTokenizerFactory" minGramSize="4" maxGramSize="5" />
    </analyzer>

      输入: "bicycle"

      输出:  "bicy", "bicyc", "icyc", "icycl", "cycl", "cycle", "ycle"

    Edge N-Gram Tokenizer

      工厂类:solr.EdgeNGramTokenizerFactory

      参数:

      minGramSize:(integer 默认为1),最小n-gram大小,必须>1.

      maxGramSize:(integer 默认为1),最大n-gram大小,必须>=minGramSize.

      side:(("front" or "back", 默认为"front"),是否从文本的开头(front)或者末尾(back)计算n-grams.

      举例:

      默认行为,最大最小默认为1

    <analyzer>
        <tokenizer class="solr.EdgeNGramTokenizerFactory" />
    </analyzer>

      输入:"babaloo"

      输出: "b"

      n-gram范围2-5

    <analyzer>
        <tokenizer class="solr.EdgeNGramTokenizerFactory"
            minGramSize="2" maxGramSize="5" />
    </analyzer>

      输入: "babaloo"

      输出:"ba", "bab", "baba", "babal" 

    ICU Tokenizer

      这个分词器处理多种语言文本,并基于它的script属性恰当的分词.

      可以通过指定per-script rule files来自定义这个分词器的行为.添加每一脚本规则,指定rulefiles属性,应该包含逗号分隔的code:rulefile键值对,采用4字母ISO 15924 script code格式,接着是一个逗号,然后资源路径.举例来说,指定一个Latin(script code "Latn")和Cyrillic(script code "Cyrl")规则.你可以输入Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi.

      工厂类:solr.ICUTokenizerFactory

      参数:

        rulefile:逗号分隔的code:rulefile键值对,采用4字母ISO 15924 script code格式,接着是一个逗号,然后资源路径.

      举例:

    <analyzer>
        <!-- no customization -->
        <tokenizer class="solr.ICUTokenizerFactory" />
    </analyzer>
    <analyzer>
        <tokenizer class="solr.ICUTokenizerFactory"
            rulefiles="Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi" />
    </analyzer>

    Path Hierarchy Tokenizer

      层次路径分词器

      工厂类:solr.PathHierarchyTokenizerFactory

      参数:

        delimiter:(字符,没有默认值),你可以指定一个文件路径定界符,然后使用一个你提供的定界符替换它.这在处理反斜杠定界符的时候非常有用.

        replace:(字符,没有默认值),在token输出时指定solr使用的定界符.

      举例: 

    <fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
        <analyzer>
            <tokenizer class="solr.PathHierarchyTokenizerFactory"
                delimiter="" replace="/" />
        </analyzer>
    </fieldType>

      输入:"c:usrlocalapache"

      输出:"c:", "c:/usr", "c:/usr/local", "c:/usr/local/apache"

    Regular Expression Pattern Tokenizer

      正则表达式分词器

      这个分词器采用java的正则表达式将输入文本流分解成tokens.

      参考java文档java.util.regex.Pattern

      工厂类:solr.PatternTokenizerFactory

      参数:

        pattern:(必填),通过java.util.regex.Pattern定义正则表达式.

        group:(可选的,默认为-1),指定提取哪个正则表达式组作为tokens.-1的意思意味着这个正则表达式作为定界符来分割字符串为tokens.非负的group表明字符序列匹配正则的组应该转换为token.group 0 关联整个正则,group大于0的关联括号中的正则子表达式,从左到右计算.

      举例:

      例1:逗号分隔列表,tokens被分隔通过0个或更多的空格,逗号,0个或者更多的空格.

    <analyzer>
        <tokenizer class="solr.PatternTokenizerFactory" pattern="s*,s*" />
    </analyzer>

      输入:fee,fie, foe , fum, foo"

      输出: "fee", "fie", "foe", "fum", "foo"

      例2:简单提取,大写单词,至少有一个大写字母,接着着0个或者更多字母(包含大小写)的序列提取出来作为一个token.

    <analyzer>
        <tokenizer class="solr.PatternTokenizerFactory" pattern="[A-Z][A-Za-z]"
            group="0" />
    </analyzer>

      输入:"Hello. My name is Inigo Montoya. You killed my father. Prepare to die."

      输出:"Hello", "My", "Inigo", "Montoya", "You", "Prepare"

      例3:提取部分数字,它的前置词是"SKU", "Part" or "Part Number",区分大小写,带有一个可以选择的分号分隔符.数字部分必须是一个数字,可以包含连字符.正则捕获计数从左边括号开始,从左到右计算.第3组就是"[0-9-]+",可以匹配一个或者多个数字或者连字符.

    <analyzer>
        <tokenizer class="solr.PatternTokenizerFactory" pattern="(SKU|Part(sNumber)?):?s([0-9-]+)"
            group="3" />
    </analyzer>

       输入:"SKU: 1234, Part Number 5678, Part: 126-987"

       输出: "1234", "5678", "126-987"

    UAX29 URL Email Tokenizer

      这个分词器将文本字段分解为tokens,处理空格和标点符号和分隔符.分隔符将被丢弃,具有以下异常:

    •   句号:句号后边没有跟空格的话,将被作为一个token.
    •   单词被连字符拆分,除非单词中包含数字,在这种情况下,这个token是不会被拆分的,数字和连字符将会一起保存.
    •   识别顶级互联网域名,email地址;file://, http(s):// ,ftp:// 地址;IPv4和IPv6地址,将它们保存为一个单独的token.

      工厂类:solr.UAX29URLEmailTokenizerFactory

      参数:

        maxTokenLength:(integer,默认为255),solr忽略token,如果token的长度超过maxTokenLength的值.

      举例: 

    <analyzer>
        <tokenizer class="solr.UAX29URLEmailTokenizerFactory" />
    </analyzer>

      输入: "Visit or e-mail bob.cratchet@accarol.com"

      输出:"Visit", "http://accarol.com/contact.htm?from=external&a=10", "or", "email", "bob.cratchet@accarol.com"

    White Space Tokenizer

      空格分词器

      工厂类:solr.WhitespaceTokenizerFactory

      参数:None

      举例: 

    <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
    </analyzer>

      输入: "To be, or what?"

      输出: "To", "be,", "or", "what?"

    Related Topics

       TokenizerFactories

  • 相关阅读:
    Ubuntu 安装 JDK 7 / JDK8 的两种方式
    python 深拷贝 浅拷贝 赋值
    importlib.import_module
    pandas分块读取大量数据集
    win10下安装XGBoost Gpu版本
    win10下安装LGBM GPU版本
    统计自然语言处理(第二版)笔记1
    K-近邻算法
    2019考研的一些心得
    lib和dll的区别与使用
  • 原文地址:https://www.cnblogs.com/a198720/p/4302560.html
Copyright © 2011-2022 走看看