1.Es搜索优化(一)-基于分词模块
2.ES中文分词-IK分词
3.ESä¸çåè¯å¨
4.ElasticSearch源码:数据类型
5.es 分词问题
6.ElasticSearch åè¯å¨ï¼äºè§£ä¸ä¸
Es搜索优化(一)-基于分词模块
本文为五篇系列文章之一,分词分词旨在探讨 Elasticsearch 搜索优化中的源码分词模块。掌握分词模块是分词分词提升搜索体验的关键步骤。
首先,源码分词是分词分词将文本拆分成多个词或短语的过程。在 Elasticsearch 中,源码易语言答题卡阅卷源码分词模块是分词分词实现这一功能的核心。
分词模块由三个主要部分构成:CharacterFilters、源码Tokenizer 和 TokenFilters。分词分词CharacterFilters 对输入文本进行预处理,源码Tokenizer 将文本拆分成词,分词分词TokenFilters 则对拆分后的源码词进行进一步的清洗和标准化。
在分词过程中,分词分词CharacterFilters 的源码作用是过滤或修改文本中的字符,例如去除标点符号或特殊字符。分词分词Tokenizer 则负责将文本分割成词,这是搜索的基础。TokenFilters 则用于处理生成的词,如去除停止词、转换词干或进行词形还原。
针对业务需求,优化搜索体验尤为重要。搜索粒度最小化为词而非字,有助于提高搜索的精确度和速度。具体策略如下:
一种解决方法是通过 Token Length Filter,该过滤器允许开发者设置最小词长度,从而避免短词对搜索结果的干扰。
另一种策略是使用 Mapping Character Filter 对常见的单个词进行过滤,减少无关搜索结果的产生。
此外,展示同义词和同音词可以提升搜索体验。开发者可以自定义分词规则,libubus源码分析甚至实现热更新,以适应不断变化的业务需求。
对于想要深入了解的读者,推荐参考 Elasticsearch 官方文档。官方指南提供了详细的分词模块使用方法和最佳实践。
希望本文能帮助你解决在 Elasticsearch 搜索优化中遇到的问题。如果你觉得内容有帮助,不妨点赞支持。如有疑问或发现错误,欢迎随时留言交流。
ES中文分词-IK分词
在ES中,IK分词器是常用的中文分词器,支持自定义词库,词库热更新,无需重启集群。其Analyzer: ik_smart和Tokenizer: ik_max_word是两种常用的分词方式。ik_max_word进行最细粒度的拆分,会尽可能将文本拆分为各个可能的组合,例如"中华人民共和国国歌"会被拆分为"中华人民共和国"、"中华人民"、"中华"、"华人"、"人民共和国"、"人民"、"人"、"民"、"共和国"、"共和"、"和"、"国国"、"国歌"。linux获取源码而ik_smart则进行最粗粒度的拆分,将"中华人民共和国国歌"拆分为"中华人民共和国"和"国歌"。
IK分词器拥有自己的词库,包括关键词词库和停用词词库,支持扩展自定义词库。关键词词库会将搜索语句按照关键词进行切割,停用词词库则会直接去掉不参与分词的词汇。例如"中华人民共和国国歌"会被拆分成"中华人民共和国"和"国歌",并进行下一步的处理。
在实际使用中,IK分词器可以结合同义词功能,以达到更好的分词效果。同义词功能能够将指定的词汇转换为另一种形式,例如将"苹果"转换为"apple",这样在搜索时,系统会同时考虑"苹果"和"apple"。使用同义词功能时,需要设置type字段表示当前词是分词类型。此外,还可以使用动态同义词分词插件,根据自己的需求适配ES版本。
对于音译词的处理,可以使用pingyin分词插件。该插件能够将音译词转换为文字搜索,例如将"Apple"转换为"苹果"。可以通过访问其github地址进行了解和使用。
结合IK分词器、同义词功能和pingyin分词插件,可以实现更全面和准确的中文分词,提高搜索效率和准确性。在具体应用中,random源码详解应根据实际需求选择合适的分词方式,并结合其他功能进行优化。
ESä¸çåè¯å¨
å ¨ææç´¢å¼æä¼ç¨æç§ç®æ³å¯¹è¦å»ºç´¢å¼çææ¡£è¿è¡åæï¼ ä»ææ¡£ä¸æååºè¥å¹²Token(è¯å )ï¼ è¿äºç®æ³ç§°ä¸ºTokenizer(åè¯å¨)ï¼ è¿äºTokenä¼è¢«è¿ä¸æ¥å¤çï¼ æ¯å¦è½¬æå°åçï¼ è¿äºå¤çç®æ³è¢«ç§°ä¸ºToken Filter(è¯å å¤çå¨)ï¼è¢«å¤çåçç»æ被称为Term(è¯)ï¼ ææ¡£ä¸å å«äºå 个è¿æ ·çTerm被称为Frequency(è¯é¢)ã å¼æä¼å»ºç«Termååææ¡£çInverted Index(åæç´¢å¼)ï¼ è¿æ ·å°±è½æ ¹æ®Termå¾å¿«å°æ¾å°æºææ¡£äºã ææ¬è¢«Tokenizerå¤çåå¯è½è¦åä¸äºé¢å¤çï¼ æ¯å¦å»æéé¢çHTMLæ è®°ï¼ è¿äºå¤ççç®æ³è¢«ç§°ä¸ºCharacter Filter(å符è¿æ»¤å¨)ï¼ è¿æ´ä¸ªçåæç®æ³è¢«ç§°ä¸ºAnalyzer(åæå¨)ãæ´ä¸ªåæè¿ç¨ï¼å¦ä¸å¾æ示ï¼
ä»ç¬¬ä¸é¨åå 容å¯ä»¥çåºï¼Analyzerï¼åæå¨ï¼ç±Tokenizerï¼åè¯å¨ï¼åFilterï¼è¿æ»¤å¨ï¼ç»æã
ESå 许ç¨æ·éè¿é ç½®æ件elasticsearch.ymlèªå®ä¹åæå¨Analyzerï¼å¦ä¸ï¼
ä¸é¢é 置信æ¯æ³¨åäºä¸ä¸ªåæå¨myAnalyzerï¼å¨æ¬¡æ³¨åäºä¹åå¯ä»¥å¨ç´¢å¼æè æ¥è¯¢çæ¶åç´æ¥ä½¿ç¨ã该åæå¨çåè½åæ ååæå¨å·®ä¸å¤ï¼tokenizer: standardï¼ä½¿ç¨äºæ ååè¯å¨ ï¼filter: [standard, lowercase, stop]ï¼ä½¿ç¨äºæ åè¿æ»¤å¨ã转å°åè¿æ»¤å¨ååç¨è¯è¿æ»¤å¨ã
ElasticSearché»è®¤ä½¿ç¨çæ ååè¯å¨å¨å¤çä¸æçæ¶åä¼æä¸æåè¯ååæä¸ä¸ªä¸ä¸ªçæ±åï¼æ以å¨å¾å¤æ¶åæ们ä¼åç°ææ并ä¸ç¬¦åæ们é¢æï¼å°¤å ¶å¨æ们使ç¨ä¸æææ¬ååä¹åæ¬è¯¥ä¸ºä¸ä¸ªè¯è¯å´æäºå个çæ±åï¼å æ¤è¿éæ们使ç¨æææ´ä½³çä¸æåè¯å¨es-ikã
ik 带æ两个åè¯å¨ï¼
åºå«ï¼
ä¸é¢æ们æ¥å建ä¸ä¸ªç´¢å¼ï¼ä½¿ç¨ ikãå建ä¸ä¸ªåå« iktest çç´¢å¼ï¼è®¾ç½®å®çåæå¨ç¨ ik ï¼åè¯å¨ç¨ ik_max_wordï¼å¹¶å建ä¸ä¸ª article çç±»åï¼éé¢æä¸ä¸ª subject çå段ï¼æå®å ¶ä½¿ç¨ ik_max_word åè¯å¨ã
æ¹éæ·»å å æ¡æ°æ®ï¼è¿éææå®å æ°æ® _id æ¹ä¾¿æ¥çï¼subject å 容为æé便æ¾çå æ¡æ°é»çæ é¢
æ¥è¯¢ âå¸æéåé©å½â
è¿éç¨äºé«äº®å±æ§ highlightï¼ç´æ¥æ¾ç¤ºå° html ä¸ï¼è¢«å¹é å°çåæè¯å°ä»¥çº¢è²çªåºæ¾ç¤ºãè¥è¦ç¨è¿æ»¤æç´¢ï¼ç´æ¥å° match æ¹ä¸º term å³å¯ã
ElasticSearch源码:数据类型
ElasticSearch源码版本 7.5.2,其底层基于Lucene,Lucene好比汽车的发动机,提供了基础的存储和查询功能,而ES则在此基础上增加了分布式特性。本文将简要探讨ES中的数据类型。
Lucene的FieldType是描述字段属性的核心,包含个属性,如倒排索引和DocValuesType,后者支持聚合排序。官方定义的类型如TextField,仅索引、分词但不存储,而用户可以根据需求自定义数据类型,尽管在ES中,所有数据类型都是自定义的。
Lucene文件格式类型各异,如Norms和Pre-Document Values,根据FieldType设置的不同属性,文件类型和存储结构会相应变化。Lucene通过不同的压缩类型和数据结构存储数据,但详细实现较为复杂。
在ES中,数据类型分为Meta-fields和Fields or properties。Meta-fields包括元数据字段如_index、_type和_id,它们存储在特定位置,但处理方式各异。Fields或properties则是ctf 题库 源码开发的核心,包括String(text和keyword)、数字类型、Range类型、时间类型、Boolean和Binary等。
复杂数据类型如Object和Nested用于处理嵌套结构,而Geo-point和Geo-shape用于地理信息。特殊数据类型如IP、completion和Join则在特定场景下使用。Array要求数组内字段类型一致,Multi-fields则支持多种处理方式的字符串字段。
总体来说,ES的字段类型丰富且友好,但并非所有场景都适用。开发者在实际应用中应参考官方文档和代码来选择和使用。
参考资源:org.apache.lucene.codecs.lucene (Lucene 9.0.0核心API)、Elasticsearch Guide [7.5]、elastic.co/guide/en/ela...
es 分词问题
探讨 Elasticsearch 的分词问题,我们以一个舆情搜索项目为例。该项目中,我们遇到了一个令人困惑的问题:使用关键词查询后,返回的文本内容中并未包含这个关键词。在查询结果中,关键词 "unita" 被高亮显示,但实际文本中仅有 "unit"。这引起了我们的注意。
倒排索引是 Elasticsearch 的底层原理,由 Lucene 实现。倒排索引通过构建一系列倒排链,使得通过词条查询具体的文档成为可能。在 Elasticsearch 字段类型中,分为可以分析字段(如 text)和不可分析字段(如 keyword)。不可分析字段在索引存储中是以最小单元 term 形式存在,而分析字段在索引创建过程中通过特定分析器进行分析,生成一系列的 term。通过这些 term 构建倒排索引,实现基于词条的文档查询。
以倒排索引为基础,我们深入探讨了 Elasticsearch 的倒排链概念。假设存在三篇文档,其 name 和 age 字段分别具有两条倒排链,而 describe 字段设置为 text 类型,经过标准分析器处理后,生成倒排链。各种查询,尤其是 match 查询,首先对传入文本进行切词,然后在相应字段的倒排索引链中进行查找。
Elasticsearch 的分析器是构成查询功能的关键组件,包括语言分析器、指纹分析器、标准分析器、简单分析器和自定义分析器等多种类型。分词器是分析器的一部分,负责对文本进行分词。对于英语,通常使用 standard tokenizer 进行处理。此外,分析器还包括过滤器和词干抽取器,过滤器用于去除无用文本,词干抽取器则用于提取词根,减少索引表中的词条数量,提升索引的创建、存储和查询性能。
重新审视最初的问题,使用 "unita" 进行查询却得到 "unit" 的结果,原因是分析器在处理文本时将其分解为 "unit" 和 "a"。在西班牙语分析器下,"unita" 被正确地解析为 "unit"。这一现象揭示了 Elasticsearch 在处理多语言文本时的复杂性。为了深入理解这一问题,我们可以使用分析器对 "unita" 进行单独分析,从而获得其被分解的词素。
通过分析发现,当使用 standard tokenizer 对 "unita" 进行分词时,其结果为 "unita"。然而,实际查询结果显示为 "unit",这可能是由于词干抽取器的作用,将 "unita" 转换为了 "unit"。在处理多语言文本时,分析器、分词器和词干抽取器的协同作用可能导致某些文本的解析结果与预期不符。对于这个问题,关键在于正确识别和理解 Elasticsearch 在处理不同语言文本时所采用的分析策略。
ElasticSearch åè¯å¨ï¼äºè§£ä¸ä¸
è¿ç¯æç« ä¸»è¦æ¥ä»ç»ä¸ä»ä¹æ¯ Analysis ï¼ä»ä¹æ¯åè¯å¨ï¼ä»¥å ElasticSearch èªå¸¦çåè¯å¨æ¯æä¹å·¥ä½çï¼æåä¼ä»ç»ä¸ä¸æåè¯æ¯æä¹åçãé¦å æ¥è¯´ä¸ä»ä¹æ¯ Analysisï¼
顾åæä¹ï¼ææ¬åæå°±æ¯æå ¨ææ¬è½¬æ¢æä¸ç³»ååè¯ï¼term/tokenï¼çè¿ç¨ï¼ä¹å«åè¯ãå¨ ES ä¸ï¼Analysis æ¯éè¿åè¯å¨ï¼Analyzerï¼æ¥å®ç°çï¼å¯ä½¿ç¨ ES å ç½®çåæå¨æè æéå®å¶ååæå¨ã
举ä¸ä¸ªåè¯ç®åçä¾åï¼æ¯å¦ä½ è¾å ¥ Mastering Elasticsearch ï¼ä¼èªå¨å¸®ä½ åæ两个åè¯ï¼ä¸ä¸ªæ¯ mastering ï¼å¦ä¸ä¸ªæ¯ elasticsearch ï¼å¯ä»¥çåºåè¯ä¹è¢«è½¬åæäºå°åçã
åç®åäºè§£äº Analysis ä¸ Analyzer ä¹åï¼è®©æ们æ¥çä¸åè¯å¨çç»æï¼
åè¯å¨æ¯ä¸é¨å¤çåè¯çç»ä»¶ï¼åè¯å¨ç±ä»¥ä¸ä¸é¨åç»æï¼
åæ¶ Analyzer ä¸ä¸ªé¨åä¹æ¯æ顺åºçï¼ä»å¾ä¸å¯ä»¥çåºï¼ä»ä¸å°ä¸ä¾æ¬¡ç»è¿ Character Filters ï¼ Tokenizer 以å Token Filters ï¼è¿ä¸ªé¡ºåºæ¯è¾å¥½ç解ï¼ä¸ä¸ªææ¬è¿æ¥è¯å®è¦å 对ææ¬æ°æ®è¿è¡å¤çï¼åå»åè¯ï¼æå对åè¯çç»æè¿è¡è¿æ»¤ã
å ¶ä¸ï¼ES å ç½®äºè®¸å¤åè¯å¨ï¼
æ¥ä¸æ¥ä¼å¯¹ä»¥ä¸åè¯å¨è¿è¡è®²è§£ï¼å¨è®²è§£ä¹åå æ¥çä¸å¾æç¨ç APIï¼ _analyzer API ï¼
å®å¯ä»¥éè¿ä»¥ä¸ä¸ç§æ¹å¼æ¥æ¥çåè¯å¨æ¯æä¹æ ·å·¥ä½çï¼
åäºè§£äº Analyzer API åï¼è®©æ们ä¸èµ·çä¸ ES å ç½®çåè¯å¨ï¼
é¦å æ¥ä»ç»ä¸ Stamdard Analyzer åè¯å¨ï¼
å®æ¯ ES é»è®¤çåè¯å¨ï¼å®ä¼å¯¹è¾å ¥çææ¬æè¯çæ¹å¼è¿è¡ååï¼åå好以åä¼è¿è¡è½¬å°åå¤çï¼é»è®¤ç stopwords æ¯å ³éçã
ä¸é¢ä½¿ç¨ Kibana çä¸ä¸å®æ¯æä¹æ ·è¿è¡å·¥ä½çï¼å¨ Kibana çå¼åå·¥å ·ï¼Dev Toolsï¼ä¸æå® Analyzer 为 standard ï¼å¹¶è¾å ¥ææ¬ In , Java is the best language in the world. ï¼ç¶åæ们è¿è¡ä¸ä¸ï¼
è¿è¡ç»æå¦ä¸ï¼
å¯ä»¥çåºæ¯æç §ç©ºæ ¼ãéåæ¯çæ¹å¼å¯¹è¾å ¥çææ¬è¿è¡äºè½¬æ¢ï¼æ¯å¦å¯¹ Java åäºè½¬å°åï¼å¯¹ä¸äºåç¨è¯ä¹æ²¡æå»æï¼æ¯å¦ in ã
å ¶ä¸ token 为åè¯ç»æï¼ start_offset 为起å§åç§»ï¼ end_offset 为ç»æåç§»ï¼ position 为åè¯ä½ç½®ã
ä¸é¢æ¥çä¸ Simple Analyzer åè¯å¨ï¼
å®åªå æ¬äº Lower Case ç Tokenizer ï¼å®ä¼æç §éåæ¯ååï¼éåæ¯çä¼è¢«å»é¤ï¼æå对åå好çå转å°åå¤çï¼ç¶åæ¥çç¨åæçè¾å ¥ææ¬ï¼åè¯å¨æ¢æ simple æ¥è¿è¡åè¯ï¼è¿è¡ç»æå¦ä¸ï¼
ä»ç»æä¸å¯ä»¥çåºï¼æ°å 被å»é¤æäºï¼è¯´æéåæ¯ççç¡®ä¼è¢«å»é¤ï¼ææçè¯ä¹é½åäºå°å转æ¢ã
ç°å¨ï¼æ们æ¥çä¸ Whitespace Analyzer åè¯å¨ï¼
å®é常ç®åï¼æ ¹æ®å称ä¹å¯ä»¥çåºæ¯æç §ç©ºæ ¼è¿è¡ååçï¼ä¸é¢æ们æ¥çä¸å®æ¯æä¹æ ·å·¥ä½çï¼
å¯ä»¥çåºï¼åªæ¯æç §ç©ºæ ¼è¿è¡ååï¼ æ°åè¿æ¯å¨çï¼ Java çé¦åæ¯è¿æ¯å¤§åçï¼ , è¿æ¯ä¿ççã
æ¥ä¸æ¥ç Stop Analyzer åè¯å¨ï¼
å®ç± Lowe Case ç Tokenizer å Stop ç Token Filters ç»æçï¼ç¸è¾äºåææå°ç Simple Analyzer ï¼å¤äº stop è¿æ»¤ï¼stop å°±æ¯ä¼æ the ï¼ a ï¼ is ç修饰è¯å»é¤ï¼åæ ·è®©æ们çä¸è¿è¡ç»æï¼
å¯ä»¥çå° in is the çè¯é½è¢« stop filter è¿æ»¤æäºã
æ¥ä¸æ¥çä¸ Keyword Analyzer ï¼
å®å ¶å®ä¸ååè¯å¤çï¼åªæ¯å°è¾å ¥ä½ä¸º Term è¾åºï¼æ们æ¥çä¸è¿è¡ç»æï¼
æ们å¯ä»¥çå°ï¼æ²¡æ对è¾å ¥ææ¬è¿è¡åè¯ï¼èæ¯ç´æ¥ä½ä¸º Term è¾åºäºã
æ¥ä¸æ¥çä¸ Pattern Analyzer ï¼
å®å¯ä»¥éè¿æ£å表达å¼çæ¹å¼è¿è¡åè¯ï¼é»è®¤æ¯ç¨ \W+ è¿è¡åå²çï¼ä¹å°±æ¯éåæ¯ç符åè¿è¡ååçï¼ç±äºè¿è¡ç»æå Stamdard Analyzer ä¸æ ·ï¼å°±ä¸å±ç¤ºäºã
ES 为ä¸åå½å®¶è¯è¨çè¾å ¥æä¾äº Language Analyzer åè¯å¨ï¼å¨éé¢å¯ä»¥æå®ä¸åçè¯è¨ï¼æä»¬ç¨ english è¿è¡åè¯çä¸ï¼
å¯ä»¥çåº language 被æ¹æäº languag ï¼åæ¶å®ä¹æ¯æ stop è¿æ»¤å¨çï¼æ¯å¦ in , is çè¯ä¹è¢«å»é¤äºã
æåï¼è®©æ们çä¸ä¸æåè¯ï¼
ä¸æåè¯æç¹å®çé¾ç¹ï¼ä¸åè±æï¼åè¯æèªç¶çç©ºæ ¼ä½ä¸ºåéï¼å¨ä¸æå¥åä¸ï¼ä¸è½ç®åå°ååæä¸ä¸ªä¸ªçåï¼èæ¯éè¦åææå«ä¹çè¯ï¼ä½æ¯å¨ä¸åçä¸ä¸æï¼æ¯æä¸åçç解çã
æ¯å¦ä»¥ä¸ä¾åï¼
é£ä¹ï¼è®©æ们æ¥çä¸ ICU Analyzer åè¯å¨ï¼å®æä¾äº Unicode çæ¯æï¼æ´å¥½çæ¯æäºæ´²è¯è¨ï¼
æ们å ç¨ standard æ¥åè¯ï¼ä»¥ä¾¿äºå ICU è¿è¡å¯¹æ¯ã
è¿è¡ç»æå°±ä¸å±ç¤ºäºï¼åè¯æ¯ä¸ä¸ªåä¸ä¸ªåååçï¼ææ¾ææä¸æ¯å¾å¥½ï¼æ¥ä¸æ¥ç¨ ICU è¿è¡åè¯ï¼åè¯ç»æå¦ä¸ï¼
å¯ä»¥çå°åæäº åå½ ï¼ æ ï¼ ä¼ä¸ ï¼ ç¸ç»§ ï¼ åé ï¼æ¾ç¶æ¯åæçææ好äºå¾å¤ã
è¿æ许å¤ä¸æåè¯å¨ï¼å¨è¿éå举å 个ï¼
IKï¼
jiebaï¼
THULACï¼
大家å¯ä»¥èªå·±å®è£ ä¸ï¼çä¸å®ä¸æåè¯ææã
æ¬æ主è¦ä»ç»äº ElasticSearch èªå¸¦çåè¯å¨ï¼å¦ä¹ äºä½¿ç¨ _analyzer API å»æ¥çå®çåè¯æ åµï¼æåè¿ä»ç»ä¸ä¸æåè¯æ¯æä¹åçã
Elasticsearch7.8.0集成IK分词器改源码实现MySql5.7.2实现动态词库实时更新
本文旨在探讨 Elasticsearch 7.8.0 集成 IK 分词器的改源码实现,配合 MySQl 5.7.2 实现动态词库实时更新的方法。
IK 分词器源码通过 URL 请求文件或接口实现热更新,无需重启 ES 实例。然而,这种方式并不稳定,因此,采用更为推荐的方案,即修改源码实现轮询查询数据库,以实现实时更新。
在进行配置时,需下载 IK 分词器源码,并确保 maven 依赖与 ES 版本号相匹配。引入 MySQl 驱动后,开始对源码进行修改。
首先,创建一个名为 HotDictReloadThread 的新类,用于执行远程词库热更新。接着,修改 Dictionary 类的 initial 方法,以创建并启动 HotDictReloadThread 实例,执行字典热更新操作。
在 Dictionary 类中,找到 reLoadMainDict 方法,针对扩展词库维护的逻辑,新增代码加载 MySQl 词库。为此,需预先在数据库中创建一张表,用于维护扩展词和停用词。同时,在项目根路径的 config 目录下创建 jdbc-reload.properties 配置文件,用于数据库连接配置。
通过 jdbc-reload.properties 文件加载数据库连接,执行扩展词 SQL,将结果集添加到扩展词库中。类似地,实现同步 MySQl 停用词的逻辑,确保代码的清晰性和可维护性。
完成基础配置后,打包插件并将 MySQl 驱动 mysql-connector-java.jar 与插件一同发布。将插件置于 ES 的 plugins 目录下,并确保有相应的目录结构。启动 ES,查看日志输出,以验证词库更新功能的运行状态。
在此过程中,可能遇到如 Column 'word' not found、Could not create connection to database server、no suitable driver found for jdbc:mysql://...、AccessControlException: access denied 等异常。通过调整 SQL 字段别名、确认驱动版本匹配、确保正确配置环境以及修改 Java 政策文件,这些问题均可得到解决。
本文通过具体步骤和代码示例,详细介绍了 Elasticsearch 7.8.0 集成 IK 分词器,配合 MySQl 5.7.2 实现动态词库实时更新的完整流程。读者可根据本文指南,完成相关配置和代码修改,以实现高效且稳定的词库管理。
ESèªå®ä¹åè¯å¨
esçåè¯å¨å¾å¾å æ¬3个ä½çº§æ建åå ï¼
Standard Analyzer
æ ååæ仪æç §Unicodeææ¬å段ç®æ³çå®ä¹ï¼å°ææ¬åå²æåè¯è¾¹ççåè¯ãå®å é¤äºå¤§å¤æ°æ ç¹ç¬¦å·ï¼å°åæ¾ç¤ºåè¯ï¼å¹¶æ¯æå é¤stop wordsã
Simple Analyzer
å½éå°ä¸æ¯åæ¯çå符æ¶ï¼ç®åçåæå¨ä¼å°ææ¬åææ¡ç®ãå°åæ¾ç¤ºåè¯ã
Whitespace Analyzer
ç©ºæ ¼åæå¨éå°ä»»ä½ç©ºæ ¼å符æ¶é½ä¼å°ææ¬å为å¤ä¸ªé¡¹ç®ãä¸ä¼æåè¯è½¬æ¢ä¸ºå°ååæ¯ã
Stop Analyzer
åæ¢åæ仪åSimple Analyzer类似ï¼ä½ä¹æ¯æstop wordsçå é¤ã
Keyword Analyzer
ä¸ä¸ªânoopâåæå¨ï¼å®å¯ä»¥æ¥åä»»ä½ç»å®çææ¬ï¼å¹¶è¾åºå®å ¨ç¸åçææ¬ä½ä¸ºä¸ä¸ªåè¯ã
Pattern Analyzer
使ç¨æ£å表达å¼æååè¯ï¼æ¯ælower-casingåstop wordsã
Language Analyzers
Elasticsearchæä¾è®¸å¤è¯è¨ç¹å®çåæå¨ï¼å¦è±è¯ææ³è¯ã
Fingerprint Analyzer
ä¸ä¸ªä¸é¨çåæ仪ï¼å®å¯ä»¥å建ä¸ä¸ªå¯ç¨äºéå¤æ£æµçæ纹ã
/p/fe5eaad
对ä¸æææ¬ä»¥è±æéå·ä½ä¸ºåé符åè¯ï¼
å°åæå¨è®¾ç½®å°ç´¢å¼ä¸
è·ååè¯ç»æ
/yu/article/details/
Elasticsearch(ES)分词器的那些事儿
在Elasticsearch中,分词器扮演着关键角色,它将文本拆分成可搜索的词,利于倒排索引的构建。本文将深入探讨内置分词器和IK分词器,以及自定义词库的相关内容。
2. 内置分词器包括standard,简单按照字母处理,如大写转小写;simple,分隔非字母字符;whitespace,按空格分词;stop,去除无意义词;keyword,不分词。查看分词效果可以通过通用接口进行。
对于中文分词,Elasticsearch的内置分词器不适用,这时就需要引入IK分词器。首先,从GitHub下载并安装,如cd到相应目录并执行解压和重启Elasticsearch。IK分词器提供ik_max_word和ik_smart两种模式,分别适用于Term Query和Phrase查询。要调整分词效果,可以自定义词库,通过编辑IKAnalyzer.cfg.xml和my.dic文件实现。
在实际应用中,自定义词库能确保查询的准确性,例如"追风人"在分词后保持原词,避免查询时的困扰。
总结,掌握Elasticsearch的分词器策略和自定义词库的设置,能有效提升搜索的效率和准确性。尽管本文未涉及点赞、评论和关注,但希望这些知识对您的工作有所帮助。