1、期望Elasticsearch搜索结果更准确,不可回避的三个问题
问题1:用户真正的需求是什么?
如果不能获得用户的搜索意图,搜索的准确性无从谈起。
比如:同样输入“锤子”,工匠期望的是钉子对应的“锤子”,老罗的粉丝期望的是“锤子科技”、“锤子便签”、“锤子手机”等。
即使同一用户发出的同一个查询,也可能因为用户所处场景不同,其期望结果也存在很大差异。
问题2:哪些信息是和用户需求真正相关的?
搜索引擎本质是一个匹配过程,即从海量的数据中找到匹配用户需求的内容。
判定内容与用户查询的相关性(relevance,如上图),一直是搜索引擎领域核心研究课题之一。
问题3:哪些信息是最值得用户信赖的?
衡量信息满足用户需求的两个核心属性。
举例:疫情环境下,新华网、人民网发布文章的可信性远大于某公众号大V发布的。
结构化数据库如Mysql,只能查询结果与数据库中的row的是否匹配?回答往往是“是”、“否”。
而全文搜索引擎Elasticsearch中不仅需要找到匹配的文档,还需根据它们相关度的高低进行排序。
实现相关度排序的核心概念是评分。
_score就是Elasticsearch检索返回的评分。该得分衡量每个文档与查询的匹配程度。
布尔查询中的每个must,should和must_not元素称为查询子句。
文档满足must或 should条款的标准的程度有助于文档的相关性得分。分数越高,文档就越符合您的搜索条件。
must_not子句中的条件被视为过滤器。它会影响文档是否包含在结果中,但不会影响文档的评分方式。在must_not里还可以显式指定任意过滤器,以基于结构化数据包括或排除文档。
filter:必须 匹配,但它以不评分、过滤模式来进行。filter内部语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
一句话概括:filter、must_not不影响评分,其他影响评分。
这里说是自定义评分,核心还是通过修改评分修改文档相关性,在最前面返回用户最期望的结果。
问题描述:针对商品,例如有
想要有一个提升相关度的计算,同时针对销量和浏览人数
实战问题2:基于文章点赞数计算评分。以下:title代表文章标题;like:代表点赞数。
期望评分标准:基于点赞数评分,且最终评分相对平滑。
核心原理:field_value_factor函数使用文档中的字段来影响得分。
更短时间更快习得更多干货!
1、期望Elasticsearch搜索结果更准确,不可回避的三个问题
问题1:用户真正的需求是什么?
如果不能获得用户的搜索意图,搜索的准确性无从谈起。
比如:同样输入“锤子”,工匠期望的是钉子对应的“锤子”,老罗的粉丝期望的是“锤子科技”、“锤子便签”、“锤子手机”等。
即使同一用户发出的同一个查询,也可能因为用户所处场景不同,其期望结果也存在很大差异。
问题2:哪些信息是和用户需求真正相关的?
搜索引擎本质是一个匹配过程,即从海量的数据中找到匹配用户需求的内容。
判定内容与用户查询的相关性(relevance,如上图),一直是搜索引擎领域核心研究课题之一。
第二种:查询的时候修改文档的相关性。
本小节着重讲解:查询时候修改文档相关性。
boost取值:0 - 1 之间的值,如:0.2,代表降低评分;
自定义修改满足某个查询条件的评分。
支持针对复杂查询的自定义评分业务场景。
实战问题1:如何同时根据 销量和浏览人数进行相关度提升?
问题描述:针对商品,例如有
想要有一个提升相关度的计算,同时针对销量和浏览人数
期望评分标准:基于点赞数评分,且最终评分相对平滑。
核心原理:field_value_factor函数使用文档中的字段来影响得分。
missing含义:使用 field_value_factor 时要注意,有的文档可能会缺少这个字段,加上 missing 来个这些缺失字段的文档一个缺省值
星球提问:有没有办法让同一个索引里面对固定的查询返回的相关性评分是在固定的范围之内的?比如0-100分这样的?
这样就可以知道对某些词语或文档的搜索,在索引里面是否有满足相关性的文档了。
通过设置max_boost参数,可以将新分数限制为不超过特定限制。
二次评分是指重新计算查询返回结果文档中指定个数文档的得分,Elasticsearch会截取查询返回的前N个,并使用预定义的二次评分方法来重新计算他们的得分。
对查询语句的结果不满意,需要重新打分的场景。
但,如果对全部有序的结果集进行重新排序的话势必开销会很大,使用rescore_query只对结果集的子集进行处理。
每个分片上要检查的文档数量可由window_size参数控制,默认为10。
本文主要探讨了Elasticsearch相关性、打分机制、不同自定义评分的原理、适用场景,并结合实战业务进行解读。
更多的自定义评分机制的细节需要大家参阅官方文档详细解读。
有任何问题,也欢迎留言交流。
给定一个或多个搜索词,如“高血压 患者”,从已有的若干篇文本中找出最相关的(n篇)文本。
文本检索(text retrieve)的常用策略是:用一个ranking function根据搜索词对所有文本进行排序,选取前n个,就像百度搜索一样。
显然,ranking function是决定检索效果最重要的因素,本文选用了在实际应用中效果很好的BM25。BM25其实只用到了一些基础的统计和文本处理的方法,没有很高深的算法。
上图是BM25的公式,对于一个搜索q和所有文本,计算每一篇文本d的权重。整个公式其实是TF-IDF的改进:
下面通过一个例子来实现根据BM25来进行文本检索。现在从网上爬下来了几十篇健康相关的文章,部分如下图所示。模拟输入搜索词,如“高血压 患者 药物”,搜素最相关的文章。
python的实现用到了gensim库,其中的BM25实现的源码如下:
gensim中代码写得很清楚,我们可以直接利用。
76 高血压 患者 药物 血压 治疗
关于降压药的五个问题.txt
高血压的重要治疗方式之一,就是口服降压药。对于不少刚刚被确诊的“高血压新手”来说,下面这些关于用药的事情,是必须知道的。 1. 贵的药,真的比便宜的药好用吗? 事实上,降压药物的化学机构和作用机制不一样。每一种降压药,其降压机理和适应人群都不一样。只要适合自己的病情和身体状况,就是好药。因此,不存在“贵重降压药一定比便宜的降压药好使”这一说法。 2. 能不吃药就不吃药,靠身体调节血压,这种想法对吗? 这种想法很幼稚。其实,高血压是典型的,应该尽早服药的疾病。如果服药太迟,高血压对重要脏器持续形成伤害,会让我们的身体受很大打击。所以,高血压患者尽早服药,是对身体的最好的保护。 3. 降压药是不是得吃一辈子? 对于这个问题,中医和西医有着不同的认识。西医认为,降压药服用之后不应该停用,以免血压形成波动,造成对身体的进一步伤害。中医则认为,通过适当的运动和饮食调节,早期的部分高血压患者,可以在服药之后的某段时间里停药。总之,处理这一问题的时候,我们还是要根据自己的情况而定。对于高血压前期,或者轻度高血压的人来说,在生活方式调节能够让血压稳定的情况下,可以考虑停药,采取非药物疗法。对于中度或者重度的高血压患者来说,就不能这么做了。 4. 降压药是不是要早晨服用? 一般来说,长效的降压药物,都是在早晨服用的。但是,我们也可以根据高血压患者的波动情况,适当改变服药时间。 5. 降压药是不是一旦服用就不能轻易更换? 高血压病人一旦服用了某种降压药物,就不要轻易更换。只要能维持血压在正常范围而且稳定,就不用换药。只有在原有药物不能起到控制作用的时候,再考虑更换服药方案。对于新发高血压病人来说,长效降压药若要达到稳定的降压效果,往往需要4到6周或者更长时间。如果经过4到6周也实现不了好的控制效果,可以考虑加第二种药物来联合降压,不必盲目换药。