数据结构

首先交代一下本机 MySQL 的基本信息:

属性
host 127.0.0.1
port 3306
username root
password qeephp
dbname qa_es
charset utf8mb4

社区网站的数据里面有很多张表,我们先只需要关心文章相关的表即可,表名 aws_article,我们执行一条 SELECT 查询语句,如下图:

很好,还看到数据了,我们暂时只需要关心 titlemessage 字段就好了,因为我们第一个搜索任务主要搜索这两个字段就可以。

然后我们回忆起基础准备里面介绍的,Elasticsearch 索引的是 JSON 格式的文档,我们参照数据库字段,定义一个 JSON 文档,如下:

{
"title":"hello world",
"message":"i am hello world"
}

是不是就行了?NO,我们试想一下,搜索得到这个结果之后,是不是还需要打开对应的网页啊,那要把唯一标识也加上才能生成对应的详情页网址进行跳转,另外显示结果的时候,是不是还要显示一下作者的信息呢,是不是还要显示一下发布时间呢,是不是还要显示评论个数和查看次数呢,是不是还要显示分类信息呢,统统有必要!这些信息越完整,用户越能尽早查看并做决策是否要进行点击来查看详情页面,所以,我们也要把这些字段加上。

我们把 Mock 的这个 JSON 示例索引文档提交到索引 forum 里面:

POST forum/doc/1
{
  "title": "hello world",
  "message": "i am a simple message",
  "id": "62",
  "uid": "1038",
  "comments": "1",
  "views": "1231",
  "addtime": "1456042765",
  "votes": "12",
  "category_id": "2"
}

并执行一个查询,如下图:

GET forum/_search
{
  "query": {
    "multi_match": {
      "query": "i am a simple message"
    }
  }
}

查询结果:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "forum",
        "_type": "doc",
        "_id": "1",
        "_score": 0.5753642,
        "_source": {
          "title": "hello world",
          "message": "i am a simple message",
          "id": "62",
          "uid": "1038",
          "comments": "1",
          "views": "1231",
          "addtime": "1456042765",
          "votes": "12",
          "category_id": "2"
        }
      }
    ]
  }
}

可以看到,我们已经能够通过关键字搜索到这个文档,虽然我们数据库的数据还没真的进入到 Elasticsearch 里面,此处也不是真实数据,但是我们就可以提前在Elasticsearch 里面进行搜索功能验证。这个也是 Elasticsearch 的强大之处。非常简单且可大大提高开发效率和减少原型验证时间。

下一步,我们只要想办法把数据库里面的行列格式的数据转换成上面的 JSON 文档格式就可以了。