这是一个系列的第三篇,这篇主要介绍了如何在你的数据库中进行全文搜索

目录

全文搜索

在全文搜索和一般的关键词匹配是不一样的。关键词匹配只会返回包含搜索词。但是全文搜索会把搜索词拆开来。分成一个个token。搜索出所有有相关匹配的词。我们接下来实际操作一下看一下这句话到底意味着什么。

我们的数据库里面现在有4个英灵。比方说我们现在想搜索吾王的名字:阿尔托莉雅,看看是如何操作的。

在Kibana的Console中,输入以下请求:

1
2
3
4
5
6
7
8
GET /fgo/_search
{
"query": {
"match": {
"_all": "阿尔托莉雅"
}
}
}

一般的数据库搜索,只能按照一个个字段来搜,而ES可以一下子搜索全部的字段。match里面的_all,就代表了搜索所有的字段,如果你只想搜索name字段,可以这样:

1
2
3
4
5
6
7
8
GET /fgo/_search
{
"query": {
"match": {
"name": "阿尔托莉雅"
}
}
}

ES返回如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1.9484967,
"hits": [
{
"_index": "fgo",
"_type": "servant",
"_id": "2",
"_score": 1.9484967,
"_source": {
"name": "阿尔托莉雅・潘德拉贡",
"class": "Saber",
"description": "不列颠传说中的王,被称为骑士王。阿尔托莉雅是幼名,从成为王的那一天起就被称为亚瑟王。在那个骑士道如花般凋零的时代,用手中的圣剑为不列颠带来了短暂的和平与最后的繁荣。虽然史实上是男性,但在这个世界似乎是男装的丽人。"
}
},
{
"_index": "fgo",
"_type": "servant",
"_id": "12",
"_score": 1.1048603,
"_source": {
"name": "吉尔伽美什",
"class": "Archer",
"description": "公元以前统治着苏美尔的都市国家乌鲁克的半神半人的王者。不仅仅是传说而是真实存在的人物,记述于人类最古的叙事诗《吉尔伽美什叙事诗》中的王。"
}
}
]
}
}

我们一点点来看返回的数据。

  • took: 指的是这次搜索用了多少ms
  • hits: 里面保存了这次搜索的返回数据

hits里面的内容:

  • total:总共搜索到了几条数据
  • max_score: 搜索引擎用来排序用的,越匹配搜索词的数据scroe越高。
  • hits数组:里面保存了这次搜索的返回内容的列表。

hits数组里面就是搜索返回的内容,里面每一条内容返回了当前的index,type,数据的id,以及score。_source里面保存了数据本身。

可以看到当我们搜索阿尔托莉雅的时候,不光我们需要的阿尔托莉雅・潘德拉贡返回了。连吉尔伽美什也返回了。

这是为什么呢?这和全文搜索的原理有关。因为吉尔伽美什这个字里面,也有一个“尔”字。不过没关系,因为阿尔托莉雅的score比吉尔伽美什更高,所以返回的数据排序中,匹配越精确的会在前面。

那如果我们需要完全匹配阿尔托莉雅的话,该如何搜索呢?方法如下:

1
2
3
4
5
6
7
8
GET /fgo/_search
{
"query": {
"match_phrase": {
"_all": "阿尔托莉雅"
}
}
}

可以看到,这下就只返回一个数据了。接下来,我们要更深入地了解下这个搜索引擎的一些特性。

请看下一章:第四篇:分词


题图来源:Designed by Freepik

ElasticSearch官方教程:点此进入
Kibana官方教程:点此进入