1. 分词的时机
对于ES来讲,可以对文档的内容进行分词(前提是设置了analyzed),也可以对输入的搜索词进行分词。对输入的搜索词进行分词时需要看下使用的什么类型的query。不同的query可能会对词进行分词,也可能不分词。无论是文档分词还是搜索词分词,依赖于使用的是什么分词器。分词的结果和分词规则(假设使用的是默认的standard),去掉大部分标点符号,并以此分割原词为多个词,把分分割后的词转为小写(汉字的话分完的结果)放入token组中,对于not-analyzed的词,直接把原词放入token组中。如下所示:
http://192.168.1.114:9200/_analyze?pretty&analyzer=standard&text=销售管理,结果:
{ tokens: [ { token: "销", start_offset: 0, end_offset: 1, type: "<IDEOGRAPHIC>", position: 0 }, { token: "售", start_offset: 1, end_offset: 2, type: "<IDEOGRAPHIC>", position: 1 }, { token: "管", start_offset: 2, end_offset: 3, type: "<IDEOGRAPHIC>", position: 2 }, { token: "理", start_offset: 3, end_offset: 4, type: "<IDEOGRAPHIC>", position: 3 } ] }
如果进行搜索的时候会使用倒排索引的方式进行查找。
使用不同类型的query进行搜索
1. termQuery的机制是:直接去匹配token,如上面的分词结果如果是
termQuery(销售)//无结果,token数组不存在
termQuery(销)// 有结果,token数组中存在
termQuery(售)// 有结果,token数组中存在
2. matchQuery的机制是:先检查搜索的字段类型是否是analyzed,如果是,则先使用分词器分词,再去去匹配token;如果查询的字段没有被分词,则直接去匹配token。
matchQuery(销售)
2.1 如果查询的'销售' 字段在建索引的时候没有指定not_analyzed,那么会先进行分词在查询。会分为'销'和'售',然后依次进行查询。
2.2 如果指定了not_analyzed,那么将直接使用'销售'进行查询。