专业公司网站设计企业,企业公众号开发,活动策划公司主要做什么,福州工程建设信息网站Elasticsearch应用#xff08;六#xff09;
1.什么是分词器
ES文档的数据拆分成一个个有完整含义的关键词#xff0c;并将关键词与文档对应#xff0c;这样就可以通过关键词查询文档。要想正确的分词#xff0c;需要选择合适的分词器
2.ES中的默认分词器
fingerprint…Elasticsearch应用六
1.什么是分词器
ES文档的数据拆分成一个个有完整含义的关键词并将关键词与文档对应这样就可以通过关键词查询文档。要想正确的分词需要选择合适的分词器
2.ES中的默认分词器
fingerprint删除所有符号大写转小写重复数据删除排序如果配置了停用词列表停用词也将被删除keyword不分词language用来分析特定语言文本的分析器pattern使用java正则表达式默认非字符分割english英文分析器simple非字母切分符号被过滤所有均小写standard默认的按词切分所有均小写stop停用词过滤其他与simple一样whitespace空格切分不转小写
3.分词器的组成
介绍
Character Filters 在tokenizer之前对文本进行处理。例如删除字符、替换字符。主要是对原始文本的处理Tokenizer 将文本按照一定的规则切割成词条term。例如keyword就是不分词还有ik_smart可以用java开发插实现自己的TokenizerTokenizer Filter 将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等。可能具有零个或多个按顺序应用的令牌过滤器
默认的Tokenizer
standard按照符号空格拆分letter非字母拆分为单词whitespace空格拆分lowercase等同于letterlowercase token filteruax_url_email等同于standard识别URL Email为单个单词keyword不做任何处理pattern默认模式是\W它在遇到非单词字符时会拆分文本path_hierarchy路径char_groupsimple_patternsimple_pattern_splitclassic经典但是一般只适用于英文Thai Tokenizer泰文分词器ngramedge_ngram
默认的Character Filters
可以配置多个但会影响tokenizer的position和offset信息html_strip去除HTML标签mapping字符串替换pattern_replace正则匹配替换
默认的Token Filters
将Tokenizer输出的单词进行增加修改删除Lowercasestopsynonym
4.分词器API
请求全局分词器
GET /_analyze
{analyzer:分词器,text:被分词的文本
}请求某个索引下的分词器
POST /index/_analyze
{field:字段名,text:被分词的文本
}自定义分词器
POST /_analyze
{tokenizer:分词器,filter:Token Filter,char_filter:,text:被分词的文本
}5.指定分析器
# 指定索引的默认分析器
PUT my_index
{settings: {analysis: {analyzer: {default: {type: simple}}}}
}# 指定字段的分析器
PUT my_index
{mappings: {properties: {title: {type: text,analyzer: whitespace}}}
}# 查询时指定分析器
GET my_index/_search
{query: {match: {message: {query: Quick foxes,analyzer: stop}}}
}# 指定字段的搜索(search time)分析器
# 如果指定搜索分析器则必须指定索引分析器
PUT my_index
{mappings: {properties: {title: {type: text,analyzer: whitespace,search_analyzer: simple}}}
}# 指定索引的默认分析器与搜索的默认分析器
# 如果提供了搜索分析器则必须指定默认的索引分析器
PUT my_index
{settings: {analysis: {analyzer: {default: {type: simple},default_search: {type: whitespace}}}}
}
6.自定义分词器
说明
可以在创建索引库的时候通过/settings来配置自定义的analyzer分词器
settings设置
PUT /index
{settings:{analysis:{analyzer:{ // 自定义分词器my_analyzer:{ // 自定义分词器名称tokenizer:ik_max_word,filter:pinyin}}}}
}自定义分词器
PUT /my_index
{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 /my_index/_analyze
{analyzer: my_custom_analyzer,text: Im a :) person, and you?
}7.ES如何确定搜索分析器
analyzer搜索查询中的参数search_analyzer字段的映射参数默认分词器字段分词器如果这些都没指定就使用默认分词器
8.ES如何确定索引分析器
analyzer字段的映射参数analysis.analyzer.default指数设置如果未指定这些参数则使用standard分析器
9.注意
ES仅text字段支持analyzer映射参数analyzer参数指定索引或搜索字段时用于文本分析的分析器除非使用search_analyzer映射参数覆盖否则此分析器将同时用于索引和搜索分析
10.IK分词器
为什么需要
因为内置分词器不支持中文可以看以下默认分词器对中文的效果展示
参考链接
ik分词器github地址https://github.com/medcl/elasticsearch-analysis-ik/
介绍
是一个ES的插件中文分词器支持自定义词典ik有两种分词器分别是ik_smart , ik_max_word
版本对应
IK版本ES版本master7.x - master6.x6.x5.x5.x1.10.62.4.61.9.52.3.51.8.12.2.11.7.02.1.11.5.02.0.01.2.61.0.01.2.50.90.x1.1.30.20.x1.0.00.16.2 - 0.19.0
下载地址
进入该网址https://github.com/medcl/elasticsearch-analysis-ik/releases
安装到ES中
第一种方式需要下载zip文件
解压zip文件到ES目录下的plugins目录即可重启ES
第二种方式版本需要大于5.5.1
进入到ES目录下的bin目录执行命令自己更换版本
#注意,请将版本替换为自己所需要的版本
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.1/elasticsearch-analysis-ik-7.7.1.zip# 其他命令扩展
# 查看已安装插件
elasticsearch‐plugin list
# 安装插件
elasticsearch‐plugin install analysis‐icu
# 删除插件
elasticsearch‐plugin remove analysis‐icu重启ES
两种分词器介绍
ik_smart会做最粗粒度的拆分比如会将“中华人民共和国国歌”拆分为“中华人民共和国国歌”适合 Phrase 查询ik_max_word会将文本做最细粒度的拆分比如会将“中华人民共和国国歌”拆分为“中华人民共和国中华人民中华华人人民共和国人民人民共和国共和和国国国歌”会穷尽各种可能的组合适合 Term Query
什么是词典
IK分词器根据词典进行分词词典文件在lK分词器的config目录中
main.dic IK中内置的词典。记录了IK统计的所有中文单词IKAnalyzer.cfg.xml 扩展词典
扩展字典
为什么需要扩展字典
因为ik分词器只识别默认的一些词语有一些自造词无法识别例如‘骚年极客时间朋友圈’
配置扩展字典
进入ik分词器目录下的config目录创建xxx.dic文件修改IKAnalyzer.cfg.xml文件修改内容重启ES
修改内容展示
#注意xxx.dic要与自己建立dic文件名一致
?xml version1.0 encodingUTF-8?
!DOCTYPE properties SYSTEM http://java.sun.com/dtd/properties.dtd
propertiescommentIK Analyzer 扩展配置/comment!--用户可以在这里配置自己的扩展字典 --entry keyext_dictxxx.dic/entry!--用户可以在这里配置自己的扩展停止词字典--entry keyext_stopwordsstopword.dic/entry!--用户可以在这里配置远程扩展字典 --!-- entry keyremote_ext_dictwords_location/entry --!--用户可以在这里配置远程扩展停止词字典--!-- entry keyremote_ext_stopwordswords_location/entry --
/propertiesxx.dic格式如下
十多年
李白
传智慧11.拼音分词器
为什么需要拼音分词器
要实现根据字母做补全就必须对文档按照拼音分词
安装拼音分词器参考IK的安装方式
拼音分词器官网https://github.com/medcl/elasticsearch-analysis-pinyin
拼音分词器测试
POST /_analyze
{text:如家酒店还不错,analyzer:pinyin
}
拼音分词器的问题
默认情况下不会进行分词类似于keyword默认情况下把文本的每一个字都分为了一个拼音默认情况下汉字去掉了同音字问题
同音字问题
拼音分词器适合在创建倒排索引的时候使用但不能在搜索的时候使用因为如果用户输入的是中文也会分词为拼音去匹配就会造成一些没用的文档只希望输入中文就用中文查用了拼音才用拼音分词器 自定义拼音分词器改造
使用自定义的分词器测试的时候需要指定索引库里面不能直接去访问_analyzer那个API去测试需要改为//_analyzer进行测试在创建索引库的时候需要指定mapping中的某个字段的分词器为自定义分词器
创建和搜索使用不同的分词器解决同音字问题