1、Elasticsearch: 权威指南 » 基础入门 » 排序与相关性 » 什么是相关性?
1、一些概念
反向检索词在索引中出现的频率?频率越高,相关性越低。检索词出现在多数文档中比出现在少数文档中的权重更低。
字段程度准则:字段的长度是多少?字段越长,相关性越低。检索词出现在一个短的 title 要比同样的词出现在一个长的content 字段的权重更大
单个查询可以联合使用 TF/IDF 和其他方式,比如短语查询中检索词的距离或者是模糊查询中的检索词相似度。
相关性并不只是全文本检索的专利。也适合于 yes|no的字句,匹配 字句越多,相关性的评分也就越高
如果多条查询字句被合并为一个复合查询语句。比如 bool 查询,则每个查询字句计算得出的评分会被合并到总的相关性的评分中。
2、理解评分标准
当调试一个复杂的查询语句时,想要理解 _score 究竟是如何计算是比较困难的。ElasticSearch 在每个查询语句中都有一个Explain 参数,将 Explain 设为 True 就可以得到更加详细的信息
get /_search?Explain
{
"query":{ "match":{"tweet":"honeymoon"}}
}
Explain 参数可以让返回结果添加一个 _score 评分得来依据。
增加一个 Explain 参数会为每个匹配到的文档产生一大堆的额外的内容,但是花时间去理解它是有意义的。如果现在看不明白也没有关系——等你需要的时候,再来进行回顾这一节就行。下面我们来一点点的了解这块的知识。
首先,我们看一下普通查询返回的元数据
{
"_index":"us",
"_type":"tweet",
"_id":"12",
"_score":0.076713204
"_source":{.... trimmed ....}
}
这里加入了该文档来自于哪个节点哪个分片上的信息,这对我们是比较有帮助的,因为词频率和文档频率是每个分片中计算出来的,而不是每个索引中:
"shard":1,
"_node":"mzIVYCsqSWCG_M_ZffSs9Q"
然后它提供了 _explanation . 每个入口都包含一个 description 、 value、details 字段,它分布告诉你计算的模型、计算的结果和任何我们需要的计算细节
输出 Explain 结果代价是十分昂贵的,它只能用作调试工具。千万不要用于生产环境。
第一部分是关于计算的总结:告诉了我们honeymoon 在 tweet 字段中的检索词频率/ 反向文档频率或 TF/IDF(这里的文档是一个内部的 ID,跟我们没有关系,可以忽略)
然后它提供了权重是如何计算的细节:
检索词的频率
检索词 honeymoon
在这个文档的 tweet 字段中出现的次数
反向文档频率
检索词 honeymoon
在索引上所有文档的 tweet 字段中出现的次数
字段长度准则
在这个文档中,tweet 字段内容的长度 -- 内容的越长,值越小
复杂的查询语句解释也非常的复杂,但是包含的内容与上面的例子大致相同。通过这段信息,我们可以了解搜索结果是如何产生的
json 形式的 Explain 描述是难以阅读的,但是转成YAML 会好很多,只需要在参数中加上 format = yaml
理解文档时如何被匹配到的
当Explain 选项加到某一个文档上时, Explain api 会帮助你理解为何这个文档会被匹配,更重要的是,一个文档为何没有被匹配。
请求的路径是:
get /us/tweet/12/_explain
{
"query":{
"bool":{
"filter":{ "term":{"user_id":2}},
"must":{"match":{"tweet":"honeymoon"}}
}
}
}
不只是我们之前看到的充分解释,我们现在有了一个 description 元素,它将告诉我们:
"failure to match filter: cache(user_id:[2 to 2])"
也就是我们的 user_id 过滤子句使该文档不能匹配到。
2、