ElasticSearch系列三:ElasticSearch基本操作之检索

DSL语言高级查询

    1.无条件查询 

GET /article/_search
{
  "query": {
    "match_all": {}
  }
}

    2.有查询条件

        1). 模糊匹配 match   (会根据查询得字段进行分词)             

  • match : 通过match关键词模糊匹配条件内容
  • prefix : 前缀匹配
  • regexp : 通过正则表达式来匹配数据
1.模糊查询 match, match会根据该字段的分词器,进行分词查询

GET /article/_search
{
  "from": 0,
  "size": 2,
  "query": {
    "match": {
      "title": "师"
    }
  }
}

2. 模糊短语查询

GET /article/_search
{
  "from": 0,
  "size": 2,
  "query": {
    "match_phrase": {
      "content": "老师"
    }
  }
}

3. 多个字段模糊查询
POST /article/_search
{
  "query": {
    "multi_match": {
      "query": "老师NB",
      "fields": [
        "title",
        "content"
      ]
    }
  }
}

        2)term 精确查询,不会对字段进行分词查询

                注意: 采用term精确查询, 查询字段映射类型属于为keyword.

分析“苹果手机”的分词

POST /product_db/_analyze
{
  "analyzer": "standard",
  "text": "苹果手机"
}

分析结果

{
  "tokens" : [
    {
      "token" : "苹",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "果",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "手",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "机",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    }
  ]
}

查出结果为空
GET /product_db/_search
{
  "query": {
    "term": {
      "keywords": {
        "value": "苹果"
      }
    }
  }
}

可以查出结果
GET /product_db/_search
{
  "query": {
    "term": {
      "keywords": {
        "value": "苹"
      }
    }
  }
}

           3)query_string 查询


指定字段条件查询 query_string , 含 AND 与 OR 条件

GET /product_db/_search
{
  "query": {
    "query_string": {
      "fields": [
        "keywords"
      ],
      "query": "苹果 AND 手机"
    }
  }
}


未指定字段条件查询 query_string , 含 AND 与 OR 条件

GET /product_db/_search
{
  "query": {
    "query_string": {
      "query": "苹果 AND 手机"
    }
  }
}

        4)范围查询

GET /product_db/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 2000,
        "lte": 6000
      }
    }
  },
  "from": 1,
  "size": 2,
  "_source": ["name","keywords","subTitle"]
}

        5)Filter过滤器方式查询,不会计算相关性分值,不排序, 效率高,结果可以被缓存。

GET /product_db/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "price": {
              "gte": 2000,
              "lte": 6000
            }
          }
        }
      ]
    }
  },
  "from": 1,
  "size": 2,
  "_source": ["name","keywords","subTitle"]
}

        6)组合条件查询(多条件查询)

GET /product_db/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "price": {
              "gte": 2000,
              "lte": 6000
            }
          }
        }
      ],
      "must": [
        {
          "match": {
            "keywords": "手机"
          }
        }
      ],
      "should": [
        {
          "term": {
            "name": {
              "value": "小明"
            }
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "name": {
              "value": "小小"
            }
          }
        }
      ]
    }
  },
  "from": 1,
  "size": 2,
  "_source": ["name","keywords","subTitle"]
}

        7)连接查询(多文档合并查询)

  • 父子文档查询:parent/child
  • 嵌套文档查询: nested
1.嵌套查询

GET /product_db/_search
{
  "query": {
    "nested": {
      "path": "attrs",
      "query": {
        "match": {
          "attrs.attrId": "1"
        }
      }
    }
  }
}

2.根据子文档查询父文档

GET aid_rdr_zsyy_xjb_index/_search
{
  "query": {
    "has_child": {
      "type": "aid_pat_visit",
      "query": {
        "match": {
          "aid_pat_visit.empi_id": "0000504341"
        }
      }
    }
  }
}

总结:

1. match

match:模糊匹配,需要指定字段名,会进行分词,查询条件相对来说比较宽松。

2. term

term: 查询时不会进行分词,但是如果内容进行分词了,就有可能查不到,比如查询"hello world"的字样,"hello world"会被分成hello和world,不存在"hello world",因此这里的查询结果会为空。这也是term查询和match的区别。

3. match_phase

match_phase:会对输入做分词,但是需要结果中也包含所有的分词,而且顺序要求一样。以"hello world"为例,要求结果中必须包含hello和world,而且还要求他们是连着的,顺序也是固定的,hello that world不满足,world hello也不满足条件。

4. query_string

query_string:和match类似,但是match需要指定字段名,query_string是在所有字段中搜索,范围更广泛。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch(简称ES)是一个开源的分布式搜索和分析引擎,它基于Apache Lucene库构建而成。它被设计用于快速、可扩展和分布式的全文检索,以及实时数据分析。ES具有强大的搜索能力和高效的分布式架构,能够处理大规模数据的存储、搜索和分析。 ES的核心概念是索引(Index)、文档(Document)和类型(Type)。索引是包含一系列文档的逻辑容器,每个文档都是一个JSON格式的数据对象,可以被索引和搜索。类型是文档的逻辑分类,用于区分不同类型的文档。ES提供了丰富的搜索功能,包括全文搜索、过滤器、聚合等,通过使用查询语言来实现灵活的搜索需求。 ES的分布式特性使得它非常适合处理大规模数据。它使用分片(Shard)和复制(Replica)机制来实现数据的分布和冗余备份,提高了系统的可用性和扩展性。每个索引可以被划分为多个分片,每个分片可以被部署在不同的节点上,从而实现数据的并行处理和负载均衡。 除了全文检索外,ES还提供了丰富的数据分析功能。它支持实时的数据聚合和可视化,可以用于实时监控、日志分析、业务指标分析等场景。ES还可以与其他工具和框架集成,如Kibana(可视化工具)、Logstash(日志收集工具)等,形成完整的日志分析和监控系统。 总而言之,Elasticsearch是一个强大的全文检索和分析引擎,具有高效的搜索能力、可扩展的分布式架构和丰富的数据分析功能。它在各种场景下都能发挥重要作用,包括企业搜索、电商商品搜索、日志分析等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值