新工作第十九周

今天公司宣布2.17号上班(在家办公),感谢公司的关心,等疫情过后,会更珍惜生活和工作,人生在世,确实应该感恩,这次舆情过后,大家原来觉得闹心的事情根本就不会在乎了,因为相比舆情,这些算什么呢。
z g人的幸福指数又进一步下降了,但会让我们更加珍视拥有的,媳妇老家是湖北随州的,本想着过年前幸福和闺女先去江苏老家,然后去湖北的,但1.17号我就觉得不对,所以就直接让她们从江苏回北京了,原因很简单,传染性、潜伏性、流动性真的让人很害怕。
这周主要是搜索项目逐步落地了,说点感受。
1:项目感受
搜索项目不同其他产品项目,具有技术主导性,理解核心概念很重要,否则就会跑偏,而且要串联起来,任何一个事情,如果不能把流程走通,那就会有风险。
不管是产品设计还是技术设计,如果你听不懂或者设计复杂,那就说明绝对有问题。
在具体落地的时候,还是那几点:模块化,不断的拆分、分解,明白什么是难点,逐步优化。
其实 ELK 我前期已经看了二周了,但如果没有落地,总感觉是空中楼阁,那是不是说明实践更重要?我不这么看,前期的准备也非常重要,有些概念在初步看的时候可能模模糊糊,一旦加上实践,就会茅塞顿开,不管你做了什么准备,总会有用的时候。
不落地会让人很焦虑,而落地解决问题后会让人很轻松,这就是所谓的压力吧。
不过在落地的时候,发现原来按部就班的学习方式也有问题,有的时候为了安慰自己,就会做一些笔记,其实用处不是太大,重要的是自己吃透。
比如 ELK 中有很多搜索指令,现在想想,其实它每一个指令都有应用场景,想想为什么官方要提供这个指令。
2:用户搜索
基于昵称查询,用不着中文分词,就是parse短语匹配,在 ELK 中理解text和keyword类型非常重要;query和filter上下文也很重要;match和term区别同样如此。
通过logstash将用户表(MySQL)的数据导入到 ELK 中,优势就是不用写程序,MySQL一有更新就会自动同步,类似于binlog。
但配置 logstash 并非易事,相当于学一门脚本语言,本次有两个收获。
在 ELK 中date字段存储的是UTC时间,一定不要用东8区时间存入,后续会写三篇文章(ELK date类型、logstash date filter、logstash jdbc 时间处理)。
第二个搜索就是为了让logstash找到最新更新的数据,在MySQL中应该使用unix整型的字段进行where比较,不要用datetime字段类型比较,否则会导致数据不能及时更新(还是UTC时间问题)。
logstash调试不是很方便,但通过log能够发现大部分问题,未来需要关注写入性能。
3:中文分词

昨天写了篇文章描述中文分词《 elasticsearch-analysis-hanlp中文分词器的一点心得
》,今天的收获就是如果配置enable_traditional_chinese_mode参数,就会导致索引失败,所以只好先放弃中文繁体的匹配了。
后续要简单看一点分词的理论文章。
4:文章搜索
这是难点,一方面是分词,一方面是相关性算分(结合搜索和业务需要)。
一期也用logstash进行数据导入,但有两个问题:文章表字段太多,结构复杂,导入的时候不是特别方便,但如果熟练使用logstash可能就没有该问题;另外文章很多数据(比如评论数)不在文章表,所以不能完全依赖logstash。
从这两个角度考虑,未来可能使用队列方式导入。
技术使用是要根据现有技术能力和理解逐步迭代的,所以本次相关性算分使用的方法可能不是最合适的,第一版结合 ELK 复合查询(bool)、function_score、most_fields,大概如下:

GET test/_search
{
  "explain": true
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "should": [
            {
              "multi_match": {
                "query": "虞大胆",
                "operator": "or",
                "fields": [
                  "title",
                  "content"
                ],
                "type": "most_fields",
                "tie_breaker": 0.4
              }
            },
            {
              "term": {
                "is_tj": {
                  "value": "1"
                }
              }
            }
          ],
          "filter": [
            {
              "term": {
                "status": {
                  "value": "1"
                }
              }
            }
          ]
        }
      },
      "field_value_factor": {
        "field": "num",
        "modifier": "log2p",
        "factor": 0.1
      },
      "boost_mode": "sum",
      "max_boost": 3
    }
  }
}

大家可以给点建议,可能看到explain算分过程很重要。
最后再说说疫情,可能最好的防御方式就是锻炼吧,写完我就打算出去跑一跑,同时推荐一本书《这样吃最健康》,突然发现的,打算今天再看看,里面提到身(平衡)、心(平和)、灵(愉悦),身体是自己的,没身体就什么也没了。
最后写博客也是降压的一种方式,理理思路,让自己平和一点。