“这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战”
前言
中文搜索一直是一个令人头痛的问题。一边要想着如何分词,一边还要想着如何排序。因为在实际业务中,并不是简简单单按词来排序,需要考虑这个产品的属性,比如访问数,销量等等。 从最早用sql like来实现简单的搜索,后来发现搜两个词的时候就无法进行分词搜索。 为了解决这个问题,我们改用了elasticSearch+IK分词器来实现。随之而来的问题就是怎么分词,ik虽然有自己的基础词库,但是实际的业务领域会有自己的专业名称,比如我坐在的行业保险,各种保险公司名称,险种,产品名称都不在基础词词库中,那就还需要维护扩展词库。无疑是增大了咱码农的维护工作量了。唉,那有没有一款产品可以把这些事都解决,或者说提供个傻瓜式功能给运营和产品经理去用呢?阿里的opensearch就解决了这一痛点。好了,就吹到这了,接下来咱们探讨的是opensearch解决痛点的同时又带来了哪些坑?
分词
opensearch的分词和ik不太一样,是阿里机器学习的词典+语义分析。下面将演示一个问题。
我们先搜“某安万元保2021版”来看一下分词结果
咱们关注万元保这三个字,会发现在这个语义中,被分成了“万元”“保”两个词。
我们再看一下“万元保”的分词结果
不难发现,此时被分成了“万”“元保”两个词。
在实际应用中,客户的搜索习惯总是喜欢输入短的词,在搜索“万元保”的时候,分的词并不在倒排索引中,就会导致关键的结果搜不出来,从而导致生产问题。
解决方案
那怎么解决呢?opensearch之所以是一个成熟的产品,就是因为可以用它自身的其他功能来填坑。仔细了解后会发现自定义词的优先级是高于语义分析的。咱们可以自定义一个分词器,然后词典管理里先维护好“万元保”这个词,(如果是后维护的话,切记要重建索引)。咱们来看看效果。
都被分成了“万元”“保”,这样就不会因为倒排索引里面没有导致搜不出来了。完美解决问题。