本文共 1161 字,大约阅读时间需要 3 分钟。
IPS产品关键词搜索需求要对英文标题、品牌(英文)、规格属性(英文)、产品型号、描述属性、商品特征、关键搜索词等字段进行模糊匹配搜索
前期由于拿不到数据也不清楚具体数据是什么样的,并且线上集群也没有安装IK分词器,于是做了两套方案一是直接使用模糊查询,二是使用分词查询 后面因为开发进度问题,也一直拿不到正式数据,暂时使用第一套方案,若出现性能问题再做优化 由于线上ES没有安装IK分词器,也不确定数据中会不会有中英文混合的数据,所以先自己用虚拟机搭了集群做实验,方便后期优化: 因为仅使用英文分词器,或中文分词器,对这种中英文混合的数据都不是很友好,只用中文分词器对英文单词不会进行词干提取,会降低命中率,而用英文分词则会把一句中文仅仅分成一个一个字 所以要进行自定义分词ElasticSearch的分析器实际上是将三个功能封装在一起,这三个功能按照顺序执行,而这三个功能都是能自定义的
①字符过滤器 (char_filter) 首先,字符串按顺序通过每个字符过滤器,他们的任务是在分词前整理字符串 ②分词器 (tokenizer) 其次,字符串被分词器分爲单个的词条,一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条 Hello, how are you?会被ES预设的分词器standard分成hello、how、are、you ③Token 过滤器 (filter) 最后,词条按顺序通过每个 token 过滤器,这个过程可能会改变词条(Quick -> quick)、删除词条(a、an、and、the…)、增加词条(jump和leap这种同义词) 这里我们在创建索引的时候要setting自定义分词器,这里自定义名字起为"optimizeIK", 由于观察到测试数据中会有带有HTML 标签的一些数据 所以增加了过滤这部分数据的char_filter : html_strip 并使用IK分词 tokenizer : ik_max_word 设置filter为 stemmer,这样就会对分出来的英文单词进行词干提取 设置完自定义Analyzer后 对字段进行mapping,需要使用到的这个分词器的字段 mapping上 analyzer : optimizeIK , 比如这里是对"father_type"下的"analysis_field"字段设定mapping 这样这个字段在写入时就会按照我们预设的自定义分词进行分词 需要注意的是如果还有父子mapping的话需要先对先对子type进行mapping 否则会报父type已存在的异常使用默认分词器
使用自定义分词只需要在对需要自定义分词的字段进行查询时指定相应的Analyzer,在搜索时就会用相同的分词方式对搜索关键词进行拆分检索
转载地址:http://qjzvi.baihongyu.com/