Elasticsearch(自定义分析器)

来源:互联网 发布:大淘客cms有什么用 编辑:程序博客网 时间:2024/06/05 09:45

自定义分析器

虽然Elasticsearch内置了一系列的分析器,但是真正的强大之处在于定制你自己的分析器。你可以通过在配置文件中组合字符过滤器,分词器和表征过滤器,来满足特定数据的需求。

分析器  是三个顺序执行的组件的结合(字符过滤器,分词器,表征过滤器)。

字符过滤器

    字符过滤器是让字符串在被分词前变得更加“整洁”。例如,如果我们的文    本是HTML格式,它可能会包含一些我们不想搜索的HTML标签,诸如<p>或    <div>。
        
    我们可以使用html_strip 字符过滤器来删除所有的HTML标签,并且将    HTML实体转换成对应的Unicode字符,比如将&Aacute;转成A。
    
    一个分析器可能包含零个到多个字符过滤器
    

分词器

    一个分析器 必须 包含一个分词器。分词器将字符串分割成单独的词    (terms)或表征(tokens)。standard分析器使用standard 分词器将    字符串分割成单独的字词,删除大部分标点符号,但是现存的其他分词器会    有不同的行为特征。
    
    例如,keword分词器输出和它接收到的相同的字符串,不做任何分词处    理。【whitespce 分词器】    只通过空格来分割文本。【pattern分词    器】可以通过正则表达式来分割    文本。

表征过滤器

    分词结果的表征流会根据各自的情况,传递给特定的表征过滤器。但是    Elasticsearch中有更多的选择。stemmer 表征过滤将单词转化为他们    的根    形态(root form)。ascii_folding 表征过滤器 会删除变音符    号。    ngram和edge_ngram可以让表征更适合特殊匹配情况或自动完成。

创建自定义分析器


与索引设置一样,我们预先设置好es_std分析器,我们可以再analysis字段配置字符过滤器,分词器和表征过滤器:
PUT /my_index
{
    "setting":{
        "analysis":{
            "char_filter":{...custom character filter...},
            "tokenizer":{...custom tokenizers...},
            "filter":{...custom token filters...},
            "analyzer":{...custom analyzers...}
        }
    }
}

作为例子,我们来配置一个这样的分析器:
1.用html_strip 字符过滤器去除所有的HTML标签
2.将&替换成and,使用一个自定义的mapping字符过滤器
"char_filter":{
    "&_to_and":{
        "type":"mapping",
        "mappings":["&=>and"]
    }
}

1.使用standard分词器分割单词
2.使用lowercase表征过滤器将词转为小写
3.用stop表征过滤器去除一些自定义停用词
"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"]
    }
}

用下面的方式将以上请求合并成一条:

PUT /my_index
{
    "settings":{
        "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_stopwods"]
            }
        }    
    }
}

原创粉丝点击