1倒排索引1.1图书目录和索引正向索引是目录页,根据页码查找内容倒排索引是索引页,查找对应的页码1.2搜索引擎正向索引DocumentId="DocumentContent,WordAssociationInvertedIndexWord="DocumentIdAssociationLeft:ForwardIndex="Right:InvertedIndexInvertedIndexQueryProcess查询包含"搜索引擎"的文档得到通过倒排索引,“搜索引擎”对应的文档Id为1和3,通过正向索引查询1和3的完整内容,返回最终结果。1.3倒排索引的组成1.3.1TermDictionary(TermDictionary)invertedindex是记录所有文档的词的重要组成部分,一般都比较大。从记录的词中获取关联信息到postinglist一般是用B+Tree实现的。示例如下1.3.2发帖列表(PostingList)记录了单词对应的文档由倒排索引项(Posting)组成的集合。倒排索引项(Posting)主要包含以下信息:DocumentId,用于获取原始信息词频(TF,TermFrequency),记录该词在文档中出现的次数,用于后续相关计算位置(Position)记录文档中的分词位置(多个),用于词查询(PhraseQuery)偏移量(Offset)记录词在文档中的起止位置,用于高亮案例取搜索引擎举个例子,将分词词典和倒排列表合二为一的结构ES,存储在JSON格式的文档中,文档中包含多个字段,每个字段都有自己的倒排索引。2分词将文本转换成一系列单词的过程,也称为文本分析,在ES中称为Analysis。比如文本【JavaEdge最硬核公众号】,分词结果为【JavaEdge最硬核公众号】2.1Analyzer-TokenSegmenter分词器是ES中专门做分词的组件,其组成如下:2.1.1CharacterFilters在Tokenizer之前对原文进行处理,例如添加、删除或替换字符。对于原文的处理,比如去除html特殊标签,内置的有:HTMLStrip去除html标签,转换html实体Mapping进行字符替换操作PatternReplace进行正则匹配替换,会影响post和offset由后续分词器2.1解析的信息。2Tokenizer将原文按一定规则分词,内置:standardSegmentbywordletterSegmentbynon-characterclasswhitespaceSegmentbyspaceUAXURLEmailSegmentbystandard,butnotSegmentemailandurlNGramandEdgeNGramConjunctionSegmentationPathHierachySegmentationbyfilepathExample:POST_analyze{"tokenizer":"path_hierarchy","text":"/one/two/three"}2.1.3TokenFilters对tokenizer处理过的词进行再处理,比如Converttolowercase,deleteoradd,built-in:lowercaseconvertalltermstolowercasestopdeletestopwordsNGramandEdgeNGramconjunctionssplitSynonymaddsynonymstermexample//过滤器可以有多个POST_analyze{"text":"aHelloworld!","tokenizer":"standard","filter":["stop",//去掉一个"lowercase",//lowercase{"type":"ngram","min_gram":"4","max_gram":"4"}]}//获取hell,ello,world,orld分词器的调用顺序3AnalyzeAPIES提供了一个测试分词的API接口,方便验证分词效果。端点是_analyze:3.1指定analyzerrequestPOST_analyze{"analyzer":"standard",#分词器"text":"JavaEdge公众号"#testtext}response{"tokens":[{"token":"java",#分词结果"start_offset":1,#startoffset"end_offset":5,#endoffset"type":"","position":0#分词位置},{"token":"edge","start_offset":6,"end_offset":10,"type":"","position":1}]}3.2IndexoffieldPOSTtest/_analyze{"field":指定索引"username",#testfield"text":"helloworld"#testtext}3.3自定义分词器POST_analyze{"tokenizer":"standard","filter":["lowercase"],#custom"text":"helloworld"}前默认分词器uppercase自定义小写分词器4内置分词器StandardAnalyzer默认分词器,按词拆分,支持多种语言,小写处理SimpleAnalyzer按非字母切分,小写处理WhitespaceAnalyzer按空格切分StopAnalyzerStopWord指的是修饰词比如语气词,比如如the、an、this等。与SimpleAnalyzer相比,StopWord处理关键字Analyzer不分词,直接将输入作为词输出。PatternAnalyzer使用正则表达式来自定义定界符。默认为\W+,即非单词的符号为分隔符。LanguageAnalyzer为常用语言提供了30多种分词器。5中文分词将一个汉字序列分割成单个的词。在英语中,空格被用作单词之间的自然分隔符,而在中文中,单词没有正式的分隔符。而且汉语博大精深,上下文不同,分词结果也有很大差异。例如:tabletennisracket/sell/finishedtabletennis/auction/finished下面是ES中常用的分词系统:IK实现中英文分词,可以自定义词库,支持热更新分词词典jiebapython最流行的分词系统,支持分词和词性标注,支持传统分词,自定义词典,并行分词下面是一个基于自然语言处理的分词系统:Hanlp是一个java工具包,由一系列的模型和算法,支持索引分词、传统分词、简单匹配分词(极速模式)、基于CRF模型的分词、N-最短路径分词等,实现了很多经典的分词方法。目标是在生产环境中普及自然语言处理的使用。https://github.com/hankcs/HanLPTHULACTHULexicalAnalyzerforChinese,清华大学自然语言处理与社会人文计算实验室开发的一套中文词法分析工具包,具有中文分词和词性标注功能功能https://github.com/microbun/elasticsearch-thulac-plugin6自定义TokenSegmentation当内置分词不能满足需求时,可以通过定义CharacterFilters、Tokenizer、TokenFilter来自定义分词。需要在索引配置中设置自定义分词,如下例所示:{"type":"custome","tokenizer":"standard","char_filter":["html_strip"],"filter":["lowercase","asciifolding"]}}}}}//测试自定义分词器effect:POSTtest_index/_analyze{"tokenizer":"keyword","char_filter":["html_strip"],"text":"Isthisabox?"}//获取is,this,a。Box7分词说明分词将在以下两种情况下使用:创建或更新文档时(IndexTime),将对相应的文档进行分词处理。在建立索引时,通过在IndexMapping中配置各个字段的analyzer属性来实现分词。当没有指定分词时,使用默认标准。查询时间(SearchTime)会对查询语句进行分词。查询时如何指定分词:查询时通过analyzer指定分词器,通过索引映射设置search_analyzer。分词的最佳实践。指定字段是否需要分词。如果字段不需要分词,则将type设置为keyword,既可以节省空间,又可以提高文笔。表现。善用_analyzeAPI,查看文档具体分词结果,多做动手测试参考https://blog.csdn.net/weixin_38118016/article/details/90416391https://mp.weixin.qq.com/s?__biz=MzU1NDA4NjU2MA==&mid=2247486148&idx=1&sn=817027a204650763c1bea3e837d695ea&source=41#wechat_redirect【小编推荐】比特币暴跌至3000美元的3个原因,为何继续看涨?用你喜欢的编程语言配置基础设施即代码2020年50多款Kubernetes工具值得收藏解决“删库跑路”的10个技巧带你进入Emacs世界