请教:输入汉字拼音首字母,模糊查询数据
发布于 6 年前 作者 iori2882 4113 次浏览 来自 问答

输入汉字拼音首字母,模糊查询数据,目前只有数据中预存拼音这一种方法么?比如数据库表中有name pinyin2个字段 里面存储数据 name:张三 pinyin:zhangsan,name:赵四 pinyin:zhaosi,查询输入zs,后台查询数据库pinyin这个字段,结果集为张三和赵四,就和高铁app上面查询车站那个搜索需求是一样的,主要前期设计数据库的时候没有设计pinyin这个字段,现在客户需求这个功能…有没有更好的办法解决呢?

6 回复

跑一遍脚本,给拼音加上

可以用ik-pinying分词器实现

额,目前解决这种需求,还是在数据库里加拼音字段是最好最快的解决方法了么?

最方便/高性能的手段肯定是加字段,生成拼音时可以预先提取 zs 这样的数据。

我们的后台有类似的功能,输入管理员的部分 id 模糊查询。 数据库部分不动,独立用一个基于 redis zset 的方案。 定时任务,遍历所有id, 创建对应的 reverse set;zset 的 score 可以自己定义,也可以都是零,redis 就会字典序排序了。 例如有id: [ pl, le], 创建如下 zset

zset:p =  {pl}
zset:l =  {pl, le}
zset:e =  { le}
          const chars = searchText.split('').filter(c => c.trim())
          const zsets = chars.map(c => `zset:${c}`)
          const batch = redisClient.pipeline()
          var destination = 'dest' + uuid()
          const res = await batch.zinterstore(destination, zsets.length, zsets)
            .zrevrangebyscore(destination, '+inf', '-inf', 'limit', 0, 10)
            .del(destination)
            .exec()
          const hitedId = res[1][1] || []

hitedId 就是模糊命中的 id了

回到顶部