搜索语义优化1:match_phrase和match的区别

背景介绍

在调整召回效果的时候,使用普通match得到的召回效果中规中矩,不能说错,但总归觉得不适应比较复杂的实际情况,特别是在没有做语义分析的相关工作情况下,简单的通过中文分词->中文分词,效果上并不尽如人意。结果上看通常是符合逻辑而不符合“人性”的,即使我们通过了一些其他方式对结果进行矫正。而过于复杂的方式也会对性能上造成影响,相信比起一个精心计算的需要等个一两秒的“精致结果”来说,还是一个可以立刻响应的“差不多结果”会更加合适。

问题分析

通过大量的query结果来看,目前的召回方式对于搜索词没有一个总体顺序的感觉,当query被分词以后,所有词的权重都是一样的。举例一个比较奇葩的搜索关键词:“大清 银币”。



能看得到索引中有433个相关结果。
那如果把关键词反过来变成一个不伦不类的关键词呢“银币 大清”



毫无疑问召回结果是完全一样的,因为在match层级上这两次输入完全没有一点区别(相关性分数小数点后的差异可以忽略,索引是在动态变化的,以及还有分片计算的误差)。
在这个例子中,可能“大清银币”与“银币大清”出来的结果相关性都还不错,因为本身关键词就比较偏僻,可以很有效的过滤不相干内容,那如果是相对通用的关键词呢,我希望能让和用户输入搜索词一模一样的内容更靠前,这时怎么做呢。

解决方案

官方文档中关于match_phrase的描述
我们使用的是match_phrase来解决这个问题。

大清银币的match_phrase

可以看到,在使用match_phrase语法后,原本433个搜索结果中被过滤到仅剩8个搜索结果,这8个搜索结果中都是出现了“大清银币”关键词,并且完全按照顺序,而其他400多个文本,只是同时包含了这两个关键词而已。我们再把关键词反过来试试:
银币大清的match_phrase

很好,至少我们的索引里面没有这么奇葩的文本。433个文本里面完全没有一个这样的关键词。
但是如果仅仅召回8个文本也是不行的,我的目的仅仅是抬高完全匹配的权重而不是完全过滤掉这400多个内容,所以可以使用match和match_phrase进行嵌套,然后通过设置权重来区分,如下

问题总结

收效还是比较明显的,在AB实验中可以看到用户对于这个更新的反馈还是很不错的。

你可能感兴趣的:(搜索语义优化1:match_phrase和match的区别)