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"}}}
