OpenSearch避坑指南(二)巧用模糊分析前言模糊分

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

前言

上一节,我们一起探讨了opensearch的智能分词引发的问题,原因以及解决方案。咱们这次思维再扩展一下,除了我们已经解决的“万元保”这个词,还会有其他会发生这种情况的词嘛?答案是肯定的。而且我们很难去找出所有因为语义分析导致搜不出来的词,我们也不能把这个问题暴露到实践生产中,不能让用户在实际操作中反馈出来。这样的词越多就会越导致生产问题,影响程序的健壮性。那想要提高程序功能的健壮性,就必须在代码中考虑并处理这种情况。本文将用opensearch自带的模糊分析来尽可能的减少此类情况的发生。

模糊分析

模糊搜索是指在用户搜索意图不明确时,搜索引擎将用户的查询(query)与待检索的内容(doc)进行模糊匹配,找出与查询相关的内容。是否相关主要从两个方面衡量:一是query是doc中某些内容的全拼或者简拼;二是query中内容直接在doc中出现。模糊搜索无法精确理解用户的查询意图,返回的结果中可能包括了一大批用户不想要的信息,所以在使用模糊搜索时一定要结合自己的实际场景,慎重使用。

适用场景

模糊搜索主要用户搜索意图不明确或者数据较少想返回更多查询结果的时候。主要包括以下场景。

方案

在当我们对搜索内容进行分词查询时,如果没有结果就改用模糊分析去查。因为不是词查询,所以不会走倒排索引,自然性能是有所下降的。所以在走到模糊分析逻辑时,打上日志。方便以后好找到这些问题词,进行维护。想到这了,不妨再往下多想一步。用户想搜“万元保”,但总是会打错成“万元宝”,咋办呢?虽然opensearch有同义词、拼写纠错等功能,但都是后知后觉的解决方案。我们不妨这样做,模糊分析“万元宝”还是没有结果的时候,就模糊分析拼音“wanyuanbao”。这样就可以搜出来万元保这款产品啦。然后我们再根据打的日志,找出走了这些兜底逻辑的词进行分析和维护。这样就可以避免把问题直接暴露出来。看一下代码demo

//分词搜素无结果时,再进行模糊搜索
if (openSearchResult.getTotal() < 1 && key.length() != 1 && !key.matches(PINYIN_REGEX)) {
    log.info("key={},分词搜索无结果,进行模糊搜索", key);
    searchParams.setQuery(String.format("pinyin:'%s'", key));
    openSearchResult = execute(searchParams, OsProductDTO.class);
    if (openSearchResult.getTotal() < 1) {
        log.info("key={},模糊搜索无结果,进行二级拼音模糊搜索", key);
        key = Pinyin4jUtil.toPinYinLowercase(key);
        searchParams.setQuery(String.format("pinyin:'%s'", key));
        openSearchResult = execute(searchParams, OsProductDTO.class);
    }
}
复制代码

总结

虽然巧妙的利用模糊分析可以解决分词的问题,但不是万能的。比如,在搜索“万元保“的时候搜出了其他产品,结果集并不是空,进而导致我们后续的逻辑都走不到。那么,你有什么更好的解决方案吗?欢迎留言讨论。