ElasticSearch是基于Lucene的全文检索引擎,本质也是存储和检索数据。
01|基本概念
- 索引
类似于关系型数据库中的数据库概念。
- 类型
类似于关系型数据库中的数据表。
ES 5.x中一个index可以有多种type。
ES 6.x中一个index只能有一种type。
ES 7.x以后 要逐渐移除type这个概念。
- 映射
mapping定义了每个字段的类型等信息。相当于关系型数据库中的表结构。常用数据类型:
- String类型
- text:可分词,不可参加聚合
- keyword:不可分词,数据会作为完整字段进行匹配,可以参加聚合
- 数值类型
- 基本数值类型:long、interger、short、byte、double、float、half_float
- 日期类型:date
- 数组类型:array
- 对象:object
02|Query DSL
ElasticSearch提供了基于JSON的完整查询DSL(Domain Specific Language)来定义查询。将查询DSL视为查询的AST(抽象语法树),它由两种子句组成:
- 叶子查询子句:在特定域中寻找特定的值,如mathc、term、range查询
- 复合查询子句:包装其他叶子查询或复合查询,并用于以逻辑方式组合多个查询(例如 bool或dis_max查询),或更改其行为(例如 constant_score查询)
基本语法:
POST /索引库名/_search
{
"query":{
"查询类型":{ // match_all,match,term,range等
"查询条件":"查询条件值"
}
}
}
返回结果:
{
"took" : 0, //查询花费时间,单位毫秒
"timed_out" : false, // 是否超时
"_shards" : { // 分片信息
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : { //搜索结果总揽对象
"total" : {
"value" : 1, // 搜索到的总条数
"relation" : "eq"
},
"max_score" : 1.0, // 结果集中的文档最高分
"hits" : [ //搜索结果的文档对象数组,每个元素是一条搜索到的文档信息
{
"_index" : "es_test", //索引库
"_type" : "_doc", //文档类型
"_id" : "1", //文档ID
"_score" : 1.0, // 文档得分
"_source" : { // 文档原数据
"title" : "es_study",
"name" : "colde",
"age" : 26
}
}
]
}
}
全文搜索
全文搜索能够搜索已分析的文本字段,如电子邮件正文,商品描述等。使用索引期间应用于字段的同一分析器处理查询字符串。常用方式如下:
匹配搜索
全文查询的标准查询,它可以对一个字段进行模糊,短语查询。match queries 接收text/numerics/dates, 对它们进行分词分析, 再组织成一个boolean查询。可通过operator 指定bool组合操作(or、and 默认是 or )。
查询语法:
GET /index_name/_search
{
"query":{
"match":{
"fieldName":"value"
}
}
}
上述查询会把查询条件中的value进行分词,然后进行查询,多个词之间默认是or的关系。可手动设置为and关系如下
GET /index_name/_search
{
"query":{
"match":{
"fieldName":{
"query":"value",
"operator":"and"
}
}
}
}
短语搜索
match_phrase 查询用来对一个字段进行短语查询
GET /index_name/_search
{
"query": {
"match_phrase": {
"fieldName": "fieldValue"
}
}
}
query_string查询
Query String Query提供了无需指定某字段而对文档全文进行匹配查询的一个高级查询,同时可以指定在哪些字段上进行匹配。
GET /index_name/_search
{
"query": {
"query_string" : {
"query" : "queryValue"
}
}
}
多字段匹配搜索
multi_match在 match的基础上支持对多个字段进行文本查询。
GET /index_name/_search
{
"query": {
"multi_match" : {
"query" : "queryValue",
"fields":["f1","f2"]
}
}
}
词条级搜索
可以使用term-level queries根据结构化数据中的精确值查找文档。term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解。
# 词条搜索
GET /index_name/_search
{
"query": {
"term": {
"fieldName":"fieldValue"
}
}
}
# 匹配多个词
GET /index_name/_search
{
"query": {
"terms": {
"fieldName":["field1","field2"]
}
}
}
# 范围搜索
# gte:大于等于
# gt:大于
# lte:小于等于
# lt:小于
# boost:查询权重
GET /index_name/_search
{
"query": {
"range" : {
"fieldName" : {
"gte" : 10,
"lte" : 200,
"boost" : 2.0
}
}
}
}
# 词项前缀搜索
GET /index_name/_search
{
"query": {
"prefix" : {
"name" : "so"
}
}
}