💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 简介 es在对文档进行倒排索引的需要用分析器(Analyzer)对文档进行分析、建立索引。从文档中提取词元(Token)的算法称为分词器(Tokenizer),在分词前预处理的算法称为字符过滤器(Character Filter),进一步处理词元的算法称为词元过滤器(Token Filter),最后得到词(Term)。这整个分析算法称为分析器(Analyzer)。 其工作流程: 1. 先会使用字符过滤器CharacterFilters对文档中的不需要的字符过滤(例如html语言的`<br/>`等等) 2. 用Tokenizer分词器大段的文本分成词(Tokens)(例如可以空格基准对一句话进行分词) 3. 最后用TokenFilter在对分完词的Tokens进行过滤、处理(比如除去英文常用的量词:a,the,或者把去掉英文复数等) ![](https://img.kancloud.cn/d3/e7/d3e7a56108becc18df3067c85205502b_922x95.png) 我们可以使用`_analyze`来看es的分词是不是符合我们的预期目标 # 查看分析器效果 ~~~ GET /blog/_analyze { "text": "Her(5) a Black-cats" } GET /blog/_analyze { "text": "Her(5) a Black-cats" , "analyzer": "english" } ~~~ 当然es的强大之处在于除了内置的分词器之外,我们可以自定义分析器,通过组装CharacterFilters、Tokenizer、TokenFilter三个不同组件来自定义分析器或者可以使用别人完成的分析器,最出名的就是ik中文分词插件。 除此之外我们也可以CharacterFilters、Tokenizer、TokenFilter进行自定义。 # 自定义分析器 作为示范,让我们一起来创建一个自定义分析器吧,这个分析器可以做到下面的这些事: 1. 使用 html清除 字符过滤器移除HTML部分。 2. 使用一个自定义的 映射 字符过滤器把 & 替换为 " and " : ~~~ "char_filter": { "&_to_and": { "type": "mapping", "mappings": [ "&=> and "] } } ~~~ 3. 使用 标准 分词器分词。 4. 小写词条,使用 小写 词过滤器处理。 5. 使用自定义 停止 词过滤器移除自定义的停止词列表中包含的词: ~~~ "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": { "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" ] }} }}} ~~~ 索引被创建以后,使用 analyze API 来 测试这个新的分析器: ~~~ GET /my_index1/_analyze { "analyzer":"my_analyzer", "text": "The quick & brown fox" } ~~~ 拷贝为 CURL在 SENSE 中查看 下面的缩略结果展示出我们的分析器正在正确地运行: ~~~ { "tokens": [ { "token": "quick", "start_offset": 4, "end_offset": 9, "type": "<ALPHANUM>", "position": 1 }, { "token": "and", "start_offset": 10, "end_offset": 11, "type": "<ALPHANUM>", "position": 2 }, { "token": "brown", "start_offset": 12, "end_offset": 17, "type": "<ALPHANUM>", "position": 3 }, { "token": "fox", "start_offset": 18, "end_offset": 21, "type": "<ALPHANUM>", "position": 4 } ] } ~~~