搜索引擎:ES没有Lexical Parser,对应的功能是怎么实现的?(是否真的需要Lexical Parser?)

背景

上一篇文章我们提到了 搜索引擎:Lexical Parser 成分解析

ES里没有这种模块,他是怎么实现这个类似的功能的呢

分析

假设我们的原始数据是

// doc1
{
	"city": "南京",
	"type": "租房",
	"desc": "南京租房挺便宜"
}
// doc2
{
	"city": "南京",
	"type": "二手房"
	"desc": "南京二手房老贵了"
}

假设我们对city字段和type字段建索引,得到的倒排索引应该类似这样:

city_南京:doc1 doc2
type_租房:doc1
type_二手房: doc2

先看使用lexical parser的搜索流程

query = 南京租房
经过lexical parser分析
得到 [city=南京] [type=租房]

我们取两个倒排索引的交集,也就是”与“的关系:city=南京 and type=租房

于是我们取上面两个拉链的交集,就是doc1。

于是我们知道doc1里 包含city=南京 type=租房 ,检索成功出来doc1

再看ES的搜索流程

ES会对使用某种分词器进行分词:
query = 南京租房
分词后得到
[南京] [租房]

默认情况下会去搜索所有拉链

找到拉链:

city_南京:doc1 doc2
type_租房:doc1

一般,只要有一个匹配就能召回 然后通过 tf/idf等算法对所有召回的结果算法进行排序,提高准确率

顺便聊聊 tf/idf

假设公式真就简化成 tf * idf,那么这两个文档分别得分是多少?

tf: term frequency,词在文档中出现了多少次

比如 文档1中,文档经过分词后,是: [南京 租房 南京 租房 挺 便宜],分母是6,

南京在doc1中出现了2次, tf1(南京) = 2/6

同理tf1(租房)=2/6

tf2(南京)=2/6

idf:inverse doc frequency,多少个文档里包含这个词

idf(南京) = 2 / 2 = 1
idf(租房) = 2 / 1 = 2

计算两个文档的得分

tf1 = tf1(南京) * idf(南京) + tf1(租房) * idf(租房) = 2/6 * 1 + 2/6 * 2= 1
tf2 = tf2(南京) * idf(南京) = 2/6 * 1 = 1

明显文档1得分高,文档1胜出!符合预期!

附:
es怎么计算相关性的:https://www.elastic.co/guide/cn/elasticsearch/guide/cn/relevance-intro.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值