1。背景一般情况下,有些搜索需要根据拼音和中文进行搜索,那么在elasticsearch中如何实现基于拼音的搜索呢?可以通过elasticsearch-analysis-pinyinanalyzer来实现。2.安装拼音分词器#进入es的插件目录cd/usr/local/es/elasticsearch-8.4.3/plugins#下载wgethttps://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v8.4.3/elasticsearch-analysis-pinyin-8.4.3.zip#新建目录mkdiranalysis-pinyin#解压mvelasticsearch-analysis-pinyin-8.4.3.zipanalysis-pinyin&&cdanalysis-pinyin&&解压elasticsearch-analysis-pinyin-8.4.3.zip&&rm-rvfelasticsearch-analysis-pinyin-8.4.3.zipcd../&&chown-Res:esanalysis-pinyin#startes/usr/local/es/elasticsearch-8.4.3/bin/elasticsearch-d3,拼音分词器提供的功能拼音分词器提供以下功能各个选项的含义可以通过文档中的例子来理解。4.简单测试拼音分词器4.1dslGET_analyze{"text":["我是中国人"],"analyzer":"pinyin"}"analyzer":"pinyin"这里的拼音是自带的拼音分词器它的。4.2运行结果从图中可以看出,实现了拼音分词,但这并不一定能满足我们的需求。比如没有中文,单一的拼音(比如:wo)是没有用的,还需要定制拼音分词器。5.es中tokenizer的组成elasticsearch中的tokenizer分析器由以下三部分组成:characterfilters:用于处理tokenizer之前的文本。例如:删除字符、替换字符等。tokenizer:将文本按照一定的规则分割成独立的token。即实现了分词功能。tokenizerfilter:进一步处理tokenizer输出的条目。例如:同义词处理、大小写转换、去停用词、拼音处理等。6、自定义分词器,满足拼音和中文的搜索需求:自定义分词器,可实现拼音搜索和中文搜索。1.创建mappingPUT/test_pinyin{"settings":{//分析阶段的设置"analysis":{//分析器设置"analyzer":{//自定义分析器,在tokenizer阶段使用ik_max_word,在thefilterpy"custom_analyzer":{"tokenizer":"ik_max_word","filter":"custom_pinyin"}},//由于不满足拼音分词器的默认设置,我们自定义了一个基于拼音的过滤器//调用了py,里面修改了一些设置//这些设置可以在拼音分词器官网找到"filter":{"custom_pinyin":{"type":"pinyin",//不会这样划分的:AndyLau>[liu,de,hua]"keep_full_pinyin":false,//像这样划分:刘德华>[liudehua]"keep_joined_full_pinyin":true,//保留原始token(即中文)"keep_original":true,//设置first_letter结果的最大长度,默认值:16"limit_first_letter_length":16,//启用该选项时,将去除重复项以保存索引,eg:de>de,默认值:false,注意:位置相关的查询可能会受到影响"remove_duplicated_term":true,//如果非汉字是拼音,会拆分成单独的拼音词条,默认值:true,如:liudehuaalibaba13zhuanghan->liu,de,hua,a,li,ba,ba,13,zhuang,han,note:keep_none_chinese和keep_none_chinese_together应该先启用"none_chinese_pinyin_tokenize":false}}}},//定义映射"mappings":{"properties":{"name":{"type":"text",//创建倒排索引时使用的分词器"analyzer":"custom_analyzer",//搜索时使用的分词器,搜索时不使用custom_analyzer的目的是为了防止单词的拼音相同,但中文意思不同,导致搜索错误。例如:technology和aircraft,拼音相同,意思不同"search_analyzer":"ik_smart"}}}}注:可以看到我们name字段中使用的分词实现者是custom_analyzer,我们定义在上一步。但是搜索的时候用到了ik_smart,为什么会这样呢?假设我们有下面两个文本:Technologicalpower和Thisisanaircell,那么technology和aircraft的拼音是一样的。这时候如果搜索使用的tokenizer也是custom_analyzer,那么搜索technology的时候也会搜索到airliner,这是错误的。所以,搜索中文就用中文搜索,用拼音搜索就用拼音搜索。{"name":{"type":"text","analyzer":"custom_analyzer","search_analyzer":"ik_smart"}}当analyzer和search_analyzer的值都是custom_analyzer时,搜索也会被搜索通过拼音,所以结果可能不是我们想要的。2、插入数据PUT/test_pinyin/_bulk{"index":{"_id":1}}{"name":"科技强国"}{"index":{"_id":2}}{"name":"Thisisapassengerplane"}{"index":{"_id":3}}3.搜索数据7.参考文档1.https://github.com/medcl/elasticsearch-analysis-pinyin/tree/掌握
