Created
September 22, 2017 06:50
-
-
Save jcao-ai/e709498910fb3ec1059af0cd62f43bac to your computer and use it in GitHub Desktop.
Hello!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
途虎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