原文地址: 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)概念非常重要,也是完全区别于传统关系型数据库的一个概念,传统关系型数据库中的一条记录要么匹配要么不匹配。