• 回答数

    2

  • 浏览数

    153

樱桃香香
首页 > 英语培训 > 分词器英语

2个回答 默认排序
  • 默认排序
  • 按时间排序

雪皑皑xueaiai

已采纳

全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干 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 即可。

分词器英语

292 评论(15)

吃土少年Hollar

匹配全部文档 匹配单个字段,匹配字段名为filedname,值为value的文档 匹配单个字段,会拆字 精确匹配,不分词 多个字段匹配某一个值 多词条查询 模糊查询,?匹配单个字符,*匹配多个字符 正则表达式查询 一个标准的分词器提供基于语法的分词器,那是一个适合大部分欧洲语言文档的很好的分词器。分词器实现Unicode文本分割算法,该分割算法在Unicode Standard Annex #29中指定。 如果词的长度大于最短词长度则分词,则依次分成最小长度递进到最大长度的词。 例如:中华人民共和国 min_gram=2,max_gram=3。结果:中华、中华人、华人、华人民、人民、人民共、民共、民共和、共和、共和国、和国。 token_chars 所接受的以下形式: keyword分词器输出和它接收到的相同的字符串。即不分词 字符(letter)类型分词器将文本按非字符(non-lentter)进行分词。这就是说,它定义临近的最大长度的字符为一个词。注意,这个适合大部分欧洲的语言,但是对一些亚洲的语言来说就很糟糕了,它们的词不是以空格来分割的。 lowercase将词全部转换成小写,其他的同letter Tokenizer 以空格来分词 根据正则表达式的匹配规则来分词。 和标准分词器一样,但是把email和url当作一个词。 UAX Email URL Tokenizer有人翻译为'不拆分email、url的分词器',觉得不太恰当,UAX个人认为是Unicode Standard Annex,见标准分词器中。 例如:/something/something/else 结果:/something、/something/something、/something/something/else 默认定界符: / classic分词器提供基于语法的分词器,这对英语文档是一个很好的分词器。 对泰文进行分词,如果用在其他语言上同标准分词器。 目前该插件支持热更新 IK 分词,通过上文在 IK 配置文件中提到的如下配置 其中 location 是指一个 url,比如 ,该请求只需满足以下两点即可完成分词热更新。 该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。 该 http 请求返回的内容格式是一行一个分词,换行符用 \n 即可。 满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例。 将字符串分割成单独的字词 标记过滤器,将所有标记转换为小写。 标记过滤器,删除所有可能会造成搜索歧义的停用词,如 a,the,and,is。 删除所有的 HTML 标签,并且将 HTML 实体转换成对应的 Unicode 字符,比如将 Á 转成 Á。 将单词转化为他们的根形态(root form) 删除变音符号,比如从 très 转为 tres。 作为例子,我们来配置一个这样的分析器: 用 html_strip 字符过滤器去除所有的 HTML 标签 将 & 替换成 and,使用一个自定义的 mapping 字符过滤器 根据以上描述来将预定义好的分词器和过滤器组合成我们的分析器: 用下面的方式可以将以上请求合并成一条: 例如,我们有两个文档,每个文档content字段包含: 为了创建倒排索引,我们首先切分每个文档的content字段为单独的单词 现在,如果我们想搜索"quick brown",我们只需要找到每个词在哪个文档中出现即可: 两个文档都匹配,但是第一个比第二个有更多的匹配项。 如果我们加入简单的相似度算法(similarity algorithm),计算匹配单词的数目,这样我们就可以说第一个文档比第二个匹配度更高——对于我们的查询具有更多相关性。 但是在我们的倒排索引中还有些问题: 上面的索引中,搜索"+Quick +fox"不会匹配任何文档(记住,前缀+表示单词必须匹配到)。只有"Quick"和"fox"都在同一文档中才可以匹配查询,但是第一个文档包含"quick fox"且第二个文档包含"Quick foxes"。 用户可以合理地希望两个文档都能匹配查询,我们也可以做得更好。 如果我们将词为统一为标准格式,这样就可以找到不是确切匹配查询,但是足以相似从而可以关联的文档。例如: 但我们还未成功。我们的搜索"+Quick +fox"依旧失败,因为"Quick"的确切值已经不在索引里,不过,如果我们使用相同的标准化规则处理查询字符串的content字段,查询将变成"+quick +fox",这样就可以匹配到两个文档。

331 评论(10)

相关问答