原文地址: https://www.elastic.co/guide/cn/elasticsearch/guide/current/_full_text_search.html, 版权归 www.elastic.co 所有
英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/_full_text_search.html
英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/_full_text_search.html
请注意:
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
全文搜索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" ] } } ] } }
Elasticsearch 默认按照相关性得分排序,即按照每个文档与查询的匹配程度进行排序。第一个最高得分的结果很明显:John Smith 的 about
字段清楚地写着 “rock climbing” 。
但为什么 Jane Smith 也作为结果返回了呢?原因是她的 about
字段里提到了“rock” 。因为只有“rock”而没有“climbing”,所以她的 _score
(相关性得分) 低于 John 的。
这是一个很好的案例,阐明了 Elasticsearch 如何在 (within)全文字段上搜索并首先返回相关性最强的结果。Elasticsearch中的相关性(relevance)概念非常重要,也是完全区别于传统关系型数据库的一个概念,传统关系型数据库中的一条记录要么匹配要么不匹配。