截至目前的搜索相对都很简单:单个姓名,通过年龄过滤。现在尝试下稍微高级点的全文搜索——一项传统数据库确实很难搞定的任务。

    搜索下所有喜欢攀岩(rock climbing)的员工。

    1. GET /megacorp/employee/_search
    2. {
    3. "query" : {
    4. "match" : {
    5. "about" : "rock climbing"
    6. }
    7. }
    8. }

    显然我们依旧使用之前的match 查询在 about 属性上搜索“rock climbing”。得到两个匹配的文档

    {
       ...
       "hits": {
          "total":      2,
          "max_score":  0.16273327,
          "hits": [
             {
                ...
                "_score":         0.16273327, 
                "_source": {
                   "first_name":  "John",
                   "last_name":   "Smith",
                   "age":         25,
                   "about":       "I love to go rock climbing",
                   "interests": [ "sports", "music" ]
                }
             },
             {
                ...
                "_score":         0.016878016, 
                "_source": {
                   "first_name":  "Jane",
                   "last_name":   "Smith",
                   "age":         32,
                   "about":       "I like to collect rock albums",
                   "interests": [ "music" ]
                }
             }
          ]
       }
    }
    

    ELasticsearch 默认安装相关性得分排序,即每个文档跟查询的匹配程度,第一个最高得分的结果很明显:John Smith 的about 属性清楚的写着“rock climbing”。

    但为什么Jane Smith也作为结果返回了呢?原因是他的about 属性里也提到了“rock”。因为只有“rock” 而没有“climbing”,所有他的相关性得分低于John的。

    这是一个很好的案例,阐明了Elasticsearch如何在 全文属性上搜索并返回相关性最强的结果。Elasticsearch中的相关性概念非常重要,也是完全区别于传统关系型数据库的一个概念,数据库中的一条记录要么匹配要么不匹配。