在es中,所有的查询最终都会被转化成bool查询,图上的两种写法的最终效果是一模一样的,match的默认操作符就是or,将转换成bool中的should。如果变成and,则将相当于bool中的must了。
此外,其实我们可以针对should中的某一个子句,进行boost的权重设置:
TF-IDF
① TF(词频term frequency): 关键词在每个doc中出现的次数
② IDF(反文档词频inversed document frequency):关键词在整个索引中出现的次数
③ norm:字段长度越长,值越小。
空间向量模型
每个doc根据term的命中情况,会形成一个向量模型,而搜索的语句term本身也会形成一个向量模型,所谓相似度,就是看每个doc与query之间的夹角,夹角越小,说明相关度越高,评分也就越高。
计算公式
比如 query: hello word
① 计算公式:
score(q,d) =
queryNorm(q)
· coord(q,d)
· ∑ (
tf(t in d)
· idf(t)²
· t.getBoost()
· norm(t,d)
) (t in q)
1、score(q,d):query对一个doc最终的评分结果。
2、 queryNorm(q):想想normalization,在不影响相互关系的前提下,把看似离散的数据,转换到一个相近的区间=>人性化
a. queryNorm = 1 /√sumOfSquaredWeights
b. sumOfSquaredWeights是通过将查询中每个项的IDF平方相加来计算的。
3、coord(q,d): 对匹配的结果加分,越匹配的doc加分越多
doc with hello→ score: 1.5 * 1 / 3 = 0.5
doc with hello word → score: 3.0 * 2 / 3 = 2.0
doc with hello word elastic → score: 4.5 * 3 / 3 = 4.5
总分数 * 匹配的term数 / 总term数
4、 ∑:doc对query中每个trem的权重的总和
5、 tf(t in d):
a. tf(t in d) = √frequency
b. 该trem在doc中出现的次数的平方根
6、idf(t):
a. idf(t) = 1 + log ( numDocs / (docFreq + 1))
b. trem的反文档频率(idf)是索引中文档数量的对数,除以包含该trem的doc数量
7、t.getBoost():设置的权重值.
8、norm(t,d):字段长度越长,结果月越小
a. norm(d) = 1 / √numTerms
b. 字段长度范数(范数)是字段中项数的平方根的倒数