驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
ES的一个优化案例
/  

ES的一个优化案例

分析

问题和处理

问题:某一条数据包含2个字段,比如就是titlealias这2个字段。其中title通常比较短,就是一个词。alias会比较长。搜索abc的时候,即使出现的词很明显是包含在alias中的词abc,但是排名仍然比title的部分包含ab的分数低。

之前的情况是各个字段都有权重,第一个想法就是降低权重,然后搜索试试,发现情况虽然好一些,但是效果还是不好。

考虑到alias中包含的词其实是非常多的,title是比较短的,那么从匹配度来说,title因为短,所以其匹配度高。alias的长度长,所以其匹配度低。那么适当增加alias的权重,发现效果好了很多。

特殊情况

在利用ik分词器的时候,对于维生素A分词总是会被忽略A。此时可以在ik的目录下的stopword.dic中去掉a,然后重启es即可。

在ik分词器的目录中有几个特殊的文件:

  • supername.dic 里面包含的是复姓
  • stopword.dic里面包含的就是停顿词。比如维生素A,因为A包含在其中,所以分词后没有A
  • main.dicextra_main.dic都是官方定义的关键词
  • *.dic都是官方定义的词组

如果你测试发现分词效果都不好,那么修改配置文件IKAnalyzer.cfg.xml,加入自己的分词。

分词测试命令

GET /_analyze
{
  "text": "新民主主义",
  "analyzer": "ik_smart"
}

# 如果是某个已经建立的索引
GET /mine-indxe/_analyze
{
  "text": "维生素A",
  "analyzer": "ik_smart"
}

GET /mine-indxe/_analyze
{
  "text": "维生素A",
  "analyzer": "my_analyzer"
}

结语

  • 优化的时候先把权重去掉,方便处理问题
  • 英文和中文最好分开存储,方便检索
骐骥一跃,不能十步。驽马十驾,功在不舍。