🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
虽然 Elasticsearch 带有一些现成的分析器,然而在分析器上 Elasticsearch 真正的强大之处在于,你可以通过在一个适合你的特定数据的设置之中组合<mark>字符过滤器、分词器、词汇单元过滤器</mark>来创建自定义的分析器。 <br/> 一个分析器就是在一个包里面组合了三种函数的一个包装器, 三种函数按照如下顺序被执行: **1. 字符过滤器** 字符过滤器用来整理一个尚未被分词的字符串。 * html 清除字符过滤器 如果我们的文本是 HTML 格式的,它会包含像` <p>` 或者 `<div>` 这样的 HTML 标签,这些标签是我们不想索引的。我们可以使用html清除字符过滤器来移除掉所有的 HTML 标签,并且像把 `&Aacute;`这样的字符转换为相对应的 Unicode 字符 Á 这样转换 为HTML 实体。 一个分析器可能有 0 个或者多个字符过滤器。 **2. 分词器** 一个分析器必须有一个唯一的分词器。 分词器把字符串分解成单个词条或者词汇单元。 * 标准分词器:标准分析器里使用的标准分词器把一个字符串根据单词边界分解成单个词条,并且移除掉大部分的标点符号。 * 关键词分词器:完整地输出接收到的同样的字符串,并不做任何分词。 * 空格分词器:只根据空格分割文本 。 * 正则分词器:根据匹配正则表达式来分割文本 。 **3. 词单元过滤器** 经过分词,作为结果的词单元流会按照指定的顺序通过指定的词单元过滤器 。词单元过滤器可以修改、添加或者移除词单元。 * lowercase词过滤器:将分词规范化为小写,它通过language参数支持希腊语、爱尔兰语和土耳其语小写标记过滤器。 * 词干过滤器:把单词遏制为词干。 * ascii_folding 过滤器:移除变音符,把一个像 `très` 这样的词转换为 `tres`。 * ngram 和 edge_ngram 词单元过滤器:可以产生适合用于部分匹配或者自动补全的词单元。 <br/> 如下创建自定义分析器: ```json # my_index是创建的索引 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" ] } } } } } ``` 测试结果如下,表明该分析器可用。 ```json GET /my_index/_analyze { "text":"The quick & brown fox", "analyzer": "my_analyzer" } 响应结果如下: { "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 } ] } ```