新技术论坛
搜索
查看: 1903|回复: 0
打印 上一主题 下一主题

[算法分析] 一种很好用的ES默认分词器

[复制链接]
  • TA的每日心情
    开心
    2016-12-9 18:18
  • 签到天数: 85 天

    连续签到: 1 天

    [LV.6]常住居民II

    扫一扫,手机访问本帖
    楼主
    跳转到指定楼层
    发表于 2017-3-22 08:13:17 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1 Elasticsearch搜索介绍

    在Elasticsearch中的数据可以分为两类:精确值(exact values)以及全文(full text)。
    精确值:例如日期类型date,若date其有两个值:2014-09-15与2014,那么这两个值不相等。又例如字符串类型foo与Foo不相等。

    全文:通常是人类语言写的文本,例如一段tweet信息、email的内容等。
    精确值很容易被索引:一个值要么相当要么不等。 索引全文值就需要很多功夫。例如我们不仅要想:这个文档符合我们的查询吗?还要想:这个文档有多符合我们的查询?换句话说就是:这个文档跟我们的查询关联大吗?我们很少精确的去匹配整个全文,我们最想要的是去匹配全文文本的内部信息。除此,我们还希望搜索能够理解我们的意图:例如
    如果你搜索UK,我们需要包含United Kingdom的文本也会被匹配。 如果你搜索jump,那么包含jumped,jumps,jumping,更甚者leap的文本会被匹配。
    为了更方便的进行全文索引,Elasticsearch首先要先分析文本,然后使用分析过的文本去创建倒序索引。

    2 Elasticsearch全文搜索默认规则

    Elasticsearch全文检索默认分词器为standard analyzer。standard analyzer中,character Filter什么也没有做,Token Filters只是把英文大写转化为小写,因此Elasticsearch默认对大小写不敏感,下面主要介绍Tokenizer。
    token分隔符把text分隔为token(term)。数据写入的时候会使用standard analyzer处理,text会被处理为token列表。搜索的text也会执行相同的处理,最后使用处理后的token和源text处理后的token匹配。


    建立倒序索引的过程
    2.1 英文

    2.1.1 大写英文单词会转换为小写,在搜索英文时大小写不敏感

    除了“a-z、A-Z、0-9、_”以外,但不包括“.;,”这三个字符,其他情况都是token分隔符。

    2.1.2 “.”介绍

    “.”链接number和char时,作为token分隔符,其它情况不是分隔符

    1)“number.number”经过standard analyzer处理后,token列表[number.number]
    例如“123.123s”,搜索“123”是搜索不到的,搜索“123.123s”是可以匹配的
    2)“char.char”经过standard analyzer处理后,token列表[char.char]
    例如“test.test”,搜索“test”是搜索不到的,搜索“test.test”是可以匹配的
    3)“number.char或者char.number”经过standard analyzer处理后,token列表[number、char]
    例如“test1.s1”,token列表为[test1、s1],搜索“test1”是可以匹配的

    2.1.3 “;”介绍

    “;”链接number和number时,不作为token分隔符,其它情况都是分隔符

    1)“number;number”经过standard analyzer处理后,token列表[number;number]
    例如“123;123”,搜索“123”是搜索不到的,搜索“123;123”是可以匹配的
    2)“number;char或者char;number”经过standard analyzer处理后,token列表[number、char]
    例如“test1;s1”,搜索“test1”是可以匹配的
    3)“char;char”经过standard analyzer处理后,token列表[char、char]
    例如“test1;ss1”,搜索“test1s”可以匹配的

    2.1.4 “,”介绍

    “,”链接number和number时,不作为token分隔符,其它情况都是分隔符
    1)“number,number”经过standard analyzer处理后,token列表[number,number]
    例如“123,123”,搜索“123”是搜索不到的,搜索“123,123”是可以匹配的
    2)“number,char或者char,number”经过standard analyzer处理后,token列表[number、char]
    例如“test1,s1”,搜索“test1”是可以匹配的
    3)“char,char”经过standard analyzer处理后,token列表[char、char]
    例如“test;s1”,搜索“test”是可以匹配的

    2.1.5 特殊情况

    在最前面和最后面都是token分隔符

    1)“[,.;]char [,.;]”经过standard analyzer处理后,token列表[char]
    例如“,.test…”,搜索“test”可以匹配
    2)“[,.;]number [,.;]”经过standard analyzer处理后,token列表[number]
    例如“,.123…”,搜索“123”可以匹配
    3)“_[token分隔符]number或者”经过standard analyzer处理后,token列表[number]

    2.1.6 综合用例

    存储字符串:“123 test1:a_b a.b”,分词后的token为:[123、test1、a_b、a.b]

    1)使用关键字term搜索 123、test1、a_b或a.b可以匹配
    2)使用关键字term搜索“test1##a_b”也可以匹配,在这儿“#”只是起了个分隔符的作用,没有实际意义,和搜索“test1:a_b”的意义一样,搜索字符串分隔为两个token[test1和a_b]去匹配。
    3)使用关键字term搜索“test1?.,“也可以匹配,相当于使用token”test1“去搜索
    4)搜索“a“,就没有匹配结果,源字符串分隔后的token中没有“a”

    存储字符串:“123;456 test”,分词后的term为:[123;456、test]

    1) 查询“123”是没有返回结果的
    2) 查询“123:456”是没有返回结果的
    3) 查询“123;456”是有结果
    4) 查询“.123;456#”是有结果


    2.2 汉语

    除了汉字外的所有字符都是分隔符,每个字都会作为一个term。因此在搜索中,存在除了汉字以为的字符都不起任何作用,不会作为匹配字符.


    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    手机版|Archiver|开发者俱乐部 ( ICP/ISP证:辽B-2-4-20110106号 IDC证:辽B-1-2-20070003号 )

    GMT+8, 2024-12-23 04:19 , Processed in 0.117540 second(s), 18 queries .

    X+ Open Developer Network (xodn.com)

    © 2009-2017 沈阳讯网网络科技有限公司

    快速回复 返回顶部 返回列表