Skip to content

Instantly share code, notes, and snippets.

@jcao-ai
Created September 22, 2017 06:53
Show Gist options
  • Select an option

  • Save jcao-ai/cedf3eab79a4a24f2a4c2f758d9f2442 to your computer and use it in GitHub Desktop.

Select an option

Save jcao-ai/cedf3eab79a4a24f2a4c2f758d9f2442 to your computer and use it in GitHub Desktop.
Hello!

途虎APP搜索问题整理

Hey! I'm your first Markdown document in StackEdit[^stackedit]. Don't delete me, I'm very helpful! I can be recovered anyway in the Utils tab of the Settings dialog.


前言

目前来说,APP端搜索的Dataflow大致情况如下: enter image description here 主要内容

关键概念: 全文匹配人工干预排序

当前搜索主要问题

  1. 搜索例如奥德赛雨刷迈锐宝大灯, 本田机油 => 形如 [车系/品牌]+[车品名称],结果数量很少甚至为零。当前搜索关键词在ES分词后搜索时做100%匹配,即C200机油在后台分词后为C200机油,则在ES的Indexing系统中查找DisplayNameCP_ShuXing3字段,['C200', '机油']词条数组的每个元素至少都出现一次才能算结果有效,因为机油目前因此C200机油的搜索结果数为零
  2. 17寸轮胎18寸轮胎 , 2255518等等关键字搜索量高,但是搜索结果不理想,结果几乎不靠谱
  3. 5w-40机油5w40机油搜索结果差很多(分词并且完全匹配导致的结果)
  4. 分词库很不完善,例如当前分词库包含了很杂乱的汽车名词(汽车品牌,车品品牌,汽车系列),但是数据又不完整
  5. 拼音搜索支持差

解决方案

  • 搜索匹配模式启用模糊匹配。即 原来 ATSL轮胎搜不到结果是由于全文100%匹配,ATSL字不存在于标题中,因此搜索不到。
  • 对轮胎添加冗余搜索字段,如225/55R18规格的轮胎则在冗余字段中添加225551818寸轮胎18寸信息用于完全匹配用户搜索词,以防用户搜不到结果 对机油添加冗余搜索字段, 如5W-40的机油, 在创建搜索索引是在冗余字段中添加信息: 5w-40, 5w40信息
  • 分词库完善:添加了完整的汽车品牌和汽车系列名称作为分词词语
  • 添加拼音分词功能,针对有效中文字段内容做拼音索引
  • 针对目前有做过原配车型关联的车品,在做ES文档索引的时候做多表查询,将相关车型名称写入搜索索引。例如某轮胎是某辆车原配轮胎,那么用户在搜索车名+轮胎时,此记录的搜索相关性更高,内容排名更靠前。

前后对比

搜索词 结果(目前) 结果(应用解决方案后)
欧蓝德轮胎 有且匹配
18寸轮胎 相关性差 相关性好
好轮胎
5W40
5W-40
5W-40机油 有不全 有且全
5W40机油 有不全 有且全
2255518 有(原因是API替换同义词成225/55R18了)
2255518轮胎 无(原因是API无法匹配到同义词, 且ES无2255518相关分词记录)
2255518马牌 无(原因同上)
Guteyi轮胎

解决方案带来的问题

由于之前使用了搜索词分词后100%匹配,也就是欧蓝德轮胎分词后是欧蓝德轮胎,此两词必须都存在与ES建立索引时对应的某个商品的搜索字段,否则就算不匹配。因此每次搜索的结果数量级很小。

服务将分三次进行搜索:

  • 和用户默认车型原配的搜索结果
  • 和用户默认车型适配的搜索结果
  • 不适配的搜索结果

最终的搜索结果为1.concat 2.concat 3 并且如果是默认排序方式在返回给API之前会对搜索结果中

  • 先根据ProductRefer字段*(作用: 例如某机油卖得好,希望用户能第一个看见这个商品,就把这个字段设置为2,导致只要用户的搜索关键字能搜到这个商品,不管相关性多靠后,都会人工往前排到数组第2位。理论上这种做法是不可取的,但是由于之前是全文匹配,所以每次搜索结果数量本身就不大,因此这种操作的影响面并不是太大。然而使用了模糊匹配之后,每个搜索词对应的搜索结果可能达到上千的数量级,如果某个商品排在第一千位[换言之和关键字匹配度稍差])* 对搜索结果中ProductRefer有数值的重新插入结果数组的最前方。
  • 对搜索结果商品BIScore字段排序 以上操作在根据价格和销量排序时不受影响
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment