1
sdot96 2022-05-20 16:26:16 +08:00
mark ,同样好奇怎么解决这些问题
|
2
sdot96 2022-05-30 15:30:42 +08:00
case1:能否说一下,具体比如什么东西他们是可以提示,但是你们没有提示的?
case2:这个可以通过 should + constant_score + boost + match_phrase/match_phrase_prefix 进行解决。 case3:这个我理解你可以把所有数据查询出来以后,再在业务代码里面做一遍过滤 ,只给前端返回完全匹配的结果。 |
3
sdot96 2022-05-30 15:39:45 +08:00
@sdot96
修改一下,个人理解,可以看看,欢迎大佬拍砖。 ○ case1:这个我理解是你们也可以提示,但是只能提示一部分,比如一些特定的词语,比如故宫,北京,但是如果河南就不能了?如果是这样,我理解是不是可以配置 pinyin_analyzer 到你们搜索的对应字段上,可以解决你这个问题。 ○ case2:这个我理解可以通过 should + constant_score + boost + match_phrase/match_phrase_prefix 进行解决。 ○ case3: 这个我理解你可以把所有数据查询出来以后(查询的时候将完全匹配的数据进行 boost 放大),再在业务代码里面做一遍过滤(通过分数进行过滤) ,只给前端返回完全匹配的结果。 |
4
sadfQED2 OP @sdot96 #3 首先感谢回复哈
case1 主要问题是一些错字导致搜不到,比如“故宫”,用户输入了“股宫”,这样就搜不到了 我们最终的解决方案: 1 、由于我们业务场景,搜索的都是名字,并不是搜索描述文本,所以我们最终并没有使用 ik 之类的分词器进行分词,我们录入数据的时候,将名字直接拆成各种文字组合,比如“烟台国际饭店”,我们会录入“烟、烟台、烟台国、烟台国际、烟台国际饭、烟台国际饭店、台、台国、台国际、台国际饭...”,同时在这一步把所有中文也转成拼音和拼音缩写存进去。最终程序拆好词以后各个词空格隔开,存进 es ,es 里面使用空格分词 2 、基于第一步拆出来的字段,这个字段交给运营去维护,比如运营觉得搜索“顾宫”应该出现“故宫”,那么他只需要把“顾宫”加到故宫的搜索词里面即可 对于 Case3 ,我们这样自己拆词以后,搜索的时候将 es 的 operator 设置成 and 就没问题了 最后个人总结: 感觉 es 的设计是拿来做文章搜索的,对于名称这种搜索场景其实并不太合适。我们最终方案相当于仅仅是使用了 es 的倒排索引,而并没有用到 es 的分词功能 |