全文搜索edit

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

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

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}

显然我们依旧使用之前的 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" ]
            }
         }
      ]
   }
}

相关性得分(relevance scores)

Elasticsearch 默认按照相关性得分排序,即按照每个文档与查询的匹配程度进行排序。第一个最高得分的结果很明显:John Smith 的 about 字段清楚地写着 “rock climbing” 。

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

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