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查询)

基本语法:

  1. POST /索引库名/_search
  2. {
  3. "query":{
  4. "查询类型":{ // match_all,match,term,range等
  5. "查询条件":"查询条件值"
  6. }
  7. }
  8. }

返回结果:

  1. {
  2. "took" : 0, //查询花费时间,单位毫秒
  3. "timed_out" : false, // 是否超时
  4. "_shards" : { // 分片信息
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : { //搜索结果总揽对象
  11. "total" : {
  12. "value" : 1, // 搜索到的总条数
  13. "relation" : "eq"
  14. },
  15. "max_score" : 1.0, // 结果集中的文档最高分
  16. "hits" : [ //搜索结果的文档对象数组,每个元素是一条搜索到的文档信息
  17. {
  18. "_index" : "es_test", //索引库
  19. "_type" : "_doc", //文档类型
  20. "_id" : "1", //文档ID
  21. "_score" : 1.0, // 文档得分
  22. "_source" : { // 文档原数据
  23. "title" : "es_study",
  24. "name" : "colde",
  25. "age" : 26
  26. }
  27. }
  28. ]
  29. }
  30. }

全文搜索

全文搜索能够搜索已分析的文本字段,如电子邮件正文,商品描述等。使用索引期间应用于字段的同一分析器处理查询字符串。常用方式如下:

匹配搜索

全文查询的标准查询,它可以对一个字段进行模糊,短语查询。match queries 接收text/numerics/dates, 对它们进行分词分析, 再组织成一个boolean查询。可通过operator 指定bool组合操作(or、and 默认是 or )。
查询语法:

  1. GET /index_name/_search
  2. {
  3. "query":{
  4. "match":{
  5. "fieldName":"value"
  6. }
  7. }
  8. }

上述查询会把查询条件中的value进行分词,然后进行查询,多个词之间默认是or的关系。可手动设置为and关系如下

  1. GET /index_name/_search
  2. {
  3. "query":{
  4. "match":{
  5. "fieldName":{
  6. "query":"value",
  7. "operator":"and"
  8. }
  9. }
  10. }
  11. }

短语搜索

match_phrase 查询用来对一个字段进行短语查询

  1. GET /index_name/_search
  2. {
  3. "query": {
  4. "match_phrase": {
  5. "fieldName": "fieldValue"
  6. }
  7. }
  8. }

query_string查询

Query String Query提供了无需指定某字段而对文档全文进行匹配查询的一个高级查询,同时可以指定在哪些字段上进行匹配。

  1. GET /index_name/_search
  2. {
  3. "query": {
  4. "query_string" : {
  5. "query" : "queryValue"
  6. }
  7. }
  8. }

多字段匹配搜索

multi_match在 match的基础上支持对多个字段进行文本查询。

  1. GET /index_name/_search
  2. {
  3. "query": {
  4. "multi_match" : {
  5. "query" : "queryValue",
  6. "fields":["f1","f2"]
  7. }
  8. }
  9. }

词条级搜索

可以使用term-level queries根据结构化数据中的精确值查找文档。term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解。

  1. # 词条搜索
  2. GET /index_name/_search
  3. {
  4. "query": {
  5. "term": {
  6. "fieldName":"fieldValue"
  7. }
  8. }
  9. }
  10. # 匹配多个词
  11. GET /index_name/_search
  12. {
  13. "query": {
  14. "terms": {
  15. "fieldName":["field1","field2"]
  16. }
  17. }
  18. }
  19. # 范围搜索
  20. # gte:大于等于
  21. # gt:大于
  22. # lte:小于等于
  23. # lt:小于
  24. # boost:查询权重
  25. GET /index_name/_search
  26. {
  27. "query": {
  28. "range" : {
  29. "fieldName" : {
  30. "gte" : 10,
  31. "lte" : 200,
  32. "boost" : 2.0
  33. }
  34. }
  35. }
  36. }
  37. # 词项前缀搜索
  38. GET /index_name/_search
  39. {
  40. "query": {
  41. "prefix" : {
  42. "name" : "so"
  43. }
  44. }
  45. }