实际公司后台管理系统中使用了elasticsearch作为首选搜索引擎,使用传统的mysql like的确给服务器造成了不少性能压力,目前根据项目业务需求使用elasticsearch设计出了多个index/mapping,更重要的是通过开源项目go-mysql-elasticsearch,可以看一下作者siddontang使用elasticsearch的初步意图和实现目的

前言

但是在实际生产环境中遇到的问题也不少,同步中断,字段新增同步异常等问题,网上很多声音说可以尝试选择elasticsearch-jdbc,但是生产环境elasticsearch的版本比较新,查看readme, 最新只支持到v2.3.4,担心同步程序会出问题所以放弃之

推荐web端elasticsearch-head本地连接es集群,实时查看集群节点状态和数据同步是否异常,随时查看对应的index/mapping数据。如果使用谷歌浏览器的话强烈推荐其Elasticsearch Head 扩展程序,填入server地址即可连接es集群

记下几个官方文档的命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// 删除索引
$ curl -XDELETE 'http://server-domain:9200/index

// 创建type test
$ curl -XPUT 'http://server-domain:9200/index/_mapping/test' -d '{
  "properties" : {
    "timestamp" : {
      "type" : "date"
    },
    "message" : {
      "type" : "string"
    }
  }
}'

// 查看索引
$ curl 'server-domain:9200/_cat'

// 查看type的mapping
$ curl -XGET 'http://server-domain:9200/index/_mapping/type'

// 创建索引及type
$ curl -XPUT 'http://server-domain:9200/index/' -d '
{
  "settings":{
      "index":{
          "number_of_shards":1,
          "number_of_replicas":0
      }
  },
  "mappings": {
    "type_one": {
      "properties": {
        "text": {
          "type": "string",
          "analyzer": "standard"
        }
      }
    },
    "type_two": {
      "properties": {
        "text": {
          "type": "string",
          "analyzer": "standard"
        }
      }
    }
  }
}'

尝试解决数据不同步的问题

方案一 使用了网上不太成熟的npm包,顶一波mysql_2_elasticsearch,但是也有些许问题没能知道为什么,mysql表的自增 id自动替换为了表名+_id 的格式,如:users_id;但是对于异常捕获还是做得很好,预留可扩展配置exception_handler过滤不规则内容导致的同步失败问题,个人觉得还是很不错的,数据导入效率高,支持多张表同时导入。

方案二 安装composer包Maps Laravel Elasticquent,支持删除索引,新建索引,此类库依赖于官方elasticsearch包,只需要在配置文件中配置index以及server-domain,即可通过model中配置的index以及type得到搜索结果。

项目小结

多途径解决问题,使用go-mysql-elasticsearch,方便实时,但是遇到字段更新,出现表数据同步中断的情况只好删除索引,删除data/master.info,重启go-mysql-elasticsearch

使用 Maps Laravel For Elasticquent,reindex相关type后,之前未同步的type出现了,框架的好处是自动过滤掉了已经被删除的数据,目前看来情况很好,数据正常同步!

关于go-mysql-elasticsearch的安装文档