文档内容分为两部分:
1.索引过程;
2.搜索过程;
注:涉及到实现部分打算在另外一篇文章单独写;
索引过程:
简单的讲,索引过程分为创建索引节点,构建schema,原数据采集,分词,构建doc,提交索引;
打个比方,我们现在有一个用户表,定义为:
id | int |
name | varchar |
address | varchar |
我们先创建一个名为user的索引节点,构建schema结构与表相同,把varchar类型指定分词器,下面开始读一条记录出来
id | 9527 |
name | 张三 |
address | 我的家在东北,Big house |
提取句子,去除标点符号:我的家在东北 Big house
去掉字母上的音调符号,将字母统一转换成小写:我的家在东北 big house
去除常用词,将单词还原为词干形式:我 家 东北 big house
这里涉及到分词算法和策略:机械分词算法:最大匹配算法=最大正向匹配和最大逆向匹配,智能分词算法:nlp;分词策略:最大粒度分词/最小粒度分词
最大匹配算法,简单的说,就是参考定义的词典,对文本依次正向扫描和反向扫描,在词典中匹配上的结果捞出来,把两组结果做合并取最优集,剩下的字单独列出来;
nlp就是基于语义分析,对文本做场景化,语义化的分析,得到词项,这个需要大量语义化的训练效果才比较好;
最大粒度就是按词典能匹配上的最大的词保留下来,大词不进行二次细分,适用于结果较多,需要输入更精确的词才出结果的场景;
最小粒度就是按词典将所有匹配上的词都记录下来,适用于用户搜索意图不明确,搜索词较少的场景,如果结果较多,则体验不大好;
到这一步的时候,每个分出来的词叫词汇单元(token),token与字段结合形成项(term):<address,我>,<address,家>,<address,东北>,<address,big>,<address,house>
没有分词的字段直接以字段名+字段值组成term:<id,9527>,<name,张三>
实际上在切分为token时,lucene还干了一些事情,就是记录了文本值和一些元数据:原始文本从起点到终点的偏移量,词汇单元的类型,以及位置增量。
一般来说,位置增量为1,表示每个单次存在于域中连续的位置上,位置增量因子会直接影响短语查询和跨度查询,因为这些