Skip to content

Instantly share code, notes, and snippets.

@jcao-ai
Created September 22, 2017 06:50
Show Gist options
  • Save jcao-ai/e709498910fb3ec1059af0cd62f43bac to your computer and use it in GitHub Desktop.
Save jcao-ai/e709498910fb3ec1059af0cd62f43bac 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 <i class="icon-cog"></i> **Settings** dialog.
----------
前言
-------------
目前来说,APP端搜索的Dataflow大致情况如下:
![enter image description here](https://s1.ax1x.com/2017/09/22/MqKMQ.png)
主要内容
-------------
关键概念: `全文匹配`,`人工干预排序`
#### <i class="icon-file"></i>当前搜索主要问题
1. 搜索例如<kbd>奥德赛雨刷</kbd>,<kbd>迈锐宝大灯</kbd>, <kbd>本田机油</kbd> => 形如 <kbd>[车系/品牌]+[车品名称]</kbd>,结果数量很少甚至为零。当前搜索关键词在ES分词后搜索时做100%匹配,即`C200机油`在后台分词后为<kbd>C200</kbd>和<kbd>机油</kbd>,则在ES的Indexing系统中查找<kbd>DisplayName</kbd> 或 <kbd>CP_ShuXing3</kbd>字段,`['C200', '机油']`词条数组的每个元素至少都出现一次才能算结果有效,因为机油目前因此<kbd>C200机油</kbd>的搜索结果数为零
2. <kbd>17寸轮胎</kbd>,<kbd>18寸轮胎</kbd> , <kbd>2255518</kbd>等等关键字搜索量高,但是搜索结果不理想,结果几乎不靠谱
3. <kbd>5w-40机油</kbd>和<kbd>5w40机油</kbd>搜索结果差很多(分词并且完全匹配导致的结果)
4. 分词库很不完善,例如当前分词库包含了很杂乱的汽车名词(汽车品牌,车品品牌,汽车系列),但是数据又不完整
5. 拼音搜索支持差
#### <i class="icon-file"></i> 解决方案
> - 搜索匹配模式启用模糊匹配。即 原来 <kbd>ATSL轮胎</kbd>搜不到结果是由于全文100%匹配,<kbd>ATSL</kbd>字不存在于标题中,因此搜索不到。
> - 对轮胎添加冗余搜索字段,如<kbd>225/55R18</kbd>规格的轮胎则在冗余字段中添加<kbd>2255518</kbd>、<kbd>18寸轮胎</kbd>、<kbd>18寸</kbd>信息用于完全匹配用户搜索词,以防用户搜不到结果
> 对机油添加冗余搜索字段, 如`5W-40`的机油, 在创建搜索索引是在冗余字段中添加信息: <kbd>5w-40</kbd>, <kbd>5w40</kbd>信息
> - 分词库完善:添加了完整的汽车品牌和汽车系列名称作为分词词语
> - 添加拼音分词功能,针对有效中文字段内容做拼音索引
> - 针对目前有做过原配车型关联的车品,在做ES文档索引的时候做多表查询,将相关车型名称写入搜索索引。例如某轮胎是某辆车原配轮胎,那么用户在搜索<kbd>车名+轮胎</kbd>时,此记录的搜索相关性更高,内容排名更靠前。
#### <i class="icon-folder-open"></i> 前后对比
| 搜索词 | 结果(目前) | 结果(应用解决方案后) |
| ------------- |:-------------:| -----:|
| 欧蓝德轮胎 | 无 | 有且匹配 |
| 18寸轮胎 | 相关性差 | 相关性好 |
| 好轮胎 | 无 | 有|
| 5W40 | 有 | 有|
| 5W-40 | 有 | 有|
| 5W-40机油 | 有不全 | 有且全 |
| 5W40机油 | 有不全 | 有且全 |
| 2255518 | 有(原因是API替换同义词成<kbd>225/55R18</kbd>了) | 有|
| 2255518轮胎 | 无(原因是API无法匹配到同义词, 且ES无<kbd>2255518</kbd>相关分词记录) | 有|
| 2255518马牌 | 无(原因同上) | 有|
| Guteyi轮胎 | 无 | 有|
解决方案带来的问题
-------------------
由于之前使用了搜索词分词后100%匹配,也就是`欧蓝德轮胎`分词后是`欧蓝德`和`轮胎`,此两词必须都存在与ES建立索引时对应的某个商品的搜索字段,否则就算不匹配。因此每次搜索的结果数量级很小。
服务将分三次进行搜索:
- 和用户默认车型原配的搜索结果
- 和用户默认车型适配的搜索结果
- 不适配的搜索结果
****
最终的搜索结果为`1`.concat `2`.concat `3`
并且如果是**默认排序**方式在返回给API之前会对搜索结果中
- 先根据<kbd>ProductRefer</kbd>字段*(作用: 例如某机油卖得好,希望用户能第一个看见这个商品,就把这个字段设置为2,导致只要用户的搜索关键字能搜到这个商品,不管相关性多靠后,都会人工往前排到数组第2位。理论上这种做法是不可取的,但是由于之前是全文匹配,所以每次搜索结果数量本身就不大,因此这种操作的影响面并不是太大。然而使用了模糊匹配之后,每个搜索词对应的搜索结果可能达到上千的数量级,如果某个商品排在第一千位[<kbd>换言之和关键字匹配度稍差</kbd>])* 对搜索结果中<kbd>ProductRefer</kbd>有数值的重新插入结果数组的最前方。
- 对搜索结果商品BIScore字段排序
**以上操作在根据<kbd>价格和销量排序</kbd>时不受影响**
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment