lucene搜索原理讲解

本文详细讲解了Lucene的索引过程,包括创建索引节点、构建schema、分词策略以及如何构建doc。同时介绍了搜索过程,涵盖查询分词、过滤、排序和聚合。讨论了分词算法、最大匹配算法、NLP以及搜索过程中的FST结构和倒排索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文档内容分为两部分:

1.索引过程;

2.搜索过程;

注:涉及到实现部分打算在另外一篇文章单独写;

索引过程:

简单的讲,索引过程分为创建索引节点,构建schema,原数据采集,分词,构建doc,提交索引;

打个比方,我们现在有一个用户表,定义为:

id int
name varchar
address varchar
现在,要为这个表建立索引,那么首先,我们就按上面的步骤依次干活:

我们先创建一个名为user的索引节点,构建schema结构与表相同,把varchar类型指定分词器,下面开始读一条记录出来

id 9527
name 张三
address 我的家在东北,Big house
对address进行分词:

提取句子,去除标点符号:我的家在东北 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,表示每个单次存在于域中连续的位置上,位置增量因子会直接影响短语查询和跨度查询,因为这些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值