elasticsearch (1) 基础入门

本文深入讲解Elasticsearch的安装、映射、索引和搜索功能,包括文档的增删改查,批量操作,以及如何利用DSL进行精确和全文搜索。通过实例演示了如何管理和查询数据,适用于初学者和有经验的开发者。

TODO

分析器,映射,分区

安装

elastic.co/downloads/elasticsearch

映射关系
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields

curl ‘http://localhost:9200/?pretty’

索引文档

PUT /megacorp/employee/1
content-type json —
{
“first_name” : “John”,
“last_name” : “Smith”,
“age” : 25,
“about” : “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
}

检索文档

GET /megacorp/employee/1

轻量搜索

GET /megacorp/employee/_search

DSL 使用json构造请求

match :包含
有rock或者climbing 或者rock climbing都会检索出来
“match” : {
“about” : “rock climbing”
}
match_phrase 同时包含
只有包含rock climbing才会出来
“match_phrase” : {
“about” : “rock climbing”
}

GET /megacorp/employee/_search
{
“query” : {
“match” : {
“last_name” : “Smith”
}
}
}

 同样搜索姓氏为 Smith 的员工,但这次我们只需要年龄大于 30 的
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "last_name" : "smith" 
                }
            },
            "filter": {
                "range" : {
                    "age" : { "gt" : 30 } 
                }
            }
        }
    }
}
全文搜索
GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}
分析
挖掘出员工中最受欢迎的兴趣爱好:GET /megacorp/employee/_search
{
  "aggs": {
    "all_interests": {
      "terms": { "field": "interests" }
    }
  }
}
数据输入输出

什么是文档:映射MySQL为一条记录
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields

文档元数据
_index
文档在哪存放
_type
文档表示的对象类别
_id
文档唯一标识

索引文档
PUT /{index}/{type}/{id}

取出文档一部风

GET /website/blog/123?_source=title,text
{
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "123",
  "_version" : 1,
  "found" :   true,
  "_source" : {
      "title": "My first blog entry" ,
      "text":  "Just trying this out..."
  }
}

更新文档
PUT /website/blog/123
{
“title”: “My first blog entry”,
“text”: “I am starting to get the hang of this…”,
“date”: “2014/01/02”
}
创建文档
POST /website/blog/
{ … }
删除文档
DELETE /website/blog/123

冲突处理
假设有两个 web 程序并行运行,每一个都同时处理所有商品的销售
在这里插入图片描述

悲观并发控制
这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放置锁的线程能够对这行数据进行修改。
乐观并发控制
Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关情况报告给用户。

文档的部分更新(在原有的doc增加字段)

POST /website/blog/1/_update

{
   "doc" : {
      "tags" : [ "testing" ],
      "views": 0
   }
}
# 更新当发现冲突时,重试 retry_on_conflict 5次
POST /website/pageviews/1/_update?retry_on_conflict=5 

取多个文档

get   /_mget
{
   "docs" : [
      {
         "_index" : "website",
         "_type" :  "blog",
         "_id" :    2
      },
      {
         "_index" : "website", # 索引
         "_type" :  "pageviews", # 类型
         "_id" :    1,
         "_source": "views"
      }
   ]
}

GET /website/blog/_mget
{
   "docs" : [
      { "_id" : 2 },
      { "_type" : "pageviews", "_id" :   1 }
   ]
}

批量操作

create
如果文档不存在,那么就创建它。详情请见 创建新文档。
index
创建一个新文档或者替换一个现有的文档。详情请见 索引文档 和 更新整个文档。
update
部分更新一个文档。详情请见 文档的部分更新。
delete
删除一个文档。详情请见 删除文档。

POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }} 
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":    "My first blog post" }
{ "index":  { "_index": "website", "_type": "blog" }}
{ "title":    "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} } 

搜索

每个结果还有一个 _score ,它衡量了文档与查询的匹配程度。
max_score 值是与查询所匹配文档的 _score 的最大值。
took 值告诉我们执行整个搜索请求耗费了多少毫秒。
_shards 部分告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。
timed_out 值告诉我们查询是否超时。

请求体查询
空查询,查询所有
get /_search
请求体 json
{}

你可以使用 from 和 size 参数来分页
GET /_search
{
  "from": 30,
  "size": 10
}

must
文档 必须 匹配这些条件才能被包含进来。
must_not
文档 必须不 匹配这些条件才能被包含进来。
should
如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
filter
必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

{
    "bool": {
        "must":     { "match": { "tweet": "elasticsearch" }},  # 必要条件 and
        "must_not": { "match": { "name":  "mary" }}, # not 
        "should":   { "match": { "tweet": "full text" }}, # or
        "filter":   { "range": { "age" : { "gt" : 30 }} } # 过滤器 age 范围大于 30
    }
}

multi_match 查询可以在多个字段上执行相同的 match 查询:
{
    "multi_match": {
        "query":    "full text search",
        "fields":   [ "title", "body" ]
    }
}
#### 创建一个索引
PUT /my_index
#### 删除索引
delete /my_index
删除多个
DELETE /index_one,index_two

number_of_shards
每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。
number_of_replicas
每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可以随时修改。

索引别名
PUT /my_index_v1
PUT /my_index_v1/_alias/my_index

精确查询 term

constant_score 不对查询进行评分计算

SELECT product
FROM products
WHERE productID = “XHDK-A-1293-#fJ3”

GET /my_store/products/_search
{
“query” : {
“constant_score” : {
“filter” : {
“term” : {
“productID” : “XHDK-A-1293-#fJ3”
}
}
}
}
}

<think>好的,我现在需要回答用户关于Elasticsearch基础概念和入门知识的问题。首先,我应该回顾用户提供的引用内容,看看哪些信息是相关的。用户提到了引用[2]中的核心概念,比如倒排索引、文档、索引、分片与副本,还有安装配置的步骤。另外,引用[3]提到了倒排索引和评分机制,以及聚合功能,引用[4]涉及了创建索引和DSL查询。 用户的需求是了解基础概念和入门教程,所以我需要从这些引用中提取关键点,并组织成一个结构清晰的回答。首先,我应该解释Elasticsearch的背景和应用场景,然后介绍核心概念,接着是安装步骤,最后是基本操作示例。同时,需要确保使用正确的中文表达,并按照要求使用$$格式显示独立公式,比如倒排索引的结构示例。 接下来,我需要检查是否需要生成相关问题。根据示例,用户希望有三个相关问题,所以我需要围绕Elasticsearch基础概念、安装配置、查询操作等方面提出问题。 另外,用户提到的引用中有些安装步骤,比如使用elasticsearch用户启动服务,安装目录在/opt下,这些应该包含在安装指南部分。同时,引用[4]中的创建索引和DSL查询可以作为示例代码展示。 需要注意避免使用Markdown格式,但用户允许在回答中使用代码块。因此,在讲解安装和操作时,可以插入代码示例,比如启动命令和创建索引的请求。 最后,确保每个引用部分在适当的位置添加引用标识,比如在讲解倒排索引时引用[3],在安装步骤引用[1]和[2]等。同时,保持回答自然流畅,结构清晰,分点说明。</think>### Elasticsearch基础概念与入门教程 #### 一、核心概念解析 1. **倒排索引(Inverted Index)** Elasticsearch的核心数据结构,通过记录单词到文档的映射实现快速检索。例如,对文档集合: - 文档1: "Elasticsearch is powerful" - 文档2: "Search with Elasticsearch" 倒排索引结构为: $$ \begin{aligned} &\text{Term} \quad \rightarrow \quad \text{文档列表} \\ &\text{Elasticsearch} \rightarrow [1, 2] \\ &\text{search} \quad\;\, \rightarrow [1, 2] \\ &\text{powerful} \quad \rightarrow [1] \end{aligned} $$ 这种结构使得关键词搜索复杂度降低至$O(1)$[^3]。 2. **文档(Document)与索引(Index)** - **文档**:数据存储的基本单元,以JSON格式表示,如: ```json { "id": 1, "title": "Elasticsearch Guide", "content": "..." } ``` - **索引**:类似数据库表,包含相同结构的文档集合。 3. **分片(Shard)与副本(Replica)** - **分片**:索引的水平拆分,用于分布式存储和并行处理。 - **副本**:分片的拷贝,提供高可用性和负载均衡。 #### 二、安装与启动(基于Linux) 1. **下载与解压** ```bash # 切换到安装目录 cd /opt wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.0-linux-x86_64.tar.gz tar -xzf elasticsearch-7.12.0-linux-x86_64.tar.gz ``` 2. **启动服务** ```bash # 创建专用用户并启动 useradd elasticsearch su elasticsearch cd /opt/elasticsearch-7.12.0 ./bin/elasticsearch ``` 默认端口:9200(HTTP)、9300(节点通信)[^1]。 #### 三、基础操作示例 1. **创建索引** ```json PUT /book { "settings": { "number_of_shards": 3, "number_of_replicas": 1 } } ``` 此命令创建名为`book`的索引,分片数3,副本数1[^4]。 2. **插入文档** ```json POST /book/_doc/1 { "title": "Elasticsearch Basics", "author": "John Doe", "price": 29.99 } ``` 3. **基本查询** ```json GET /book/_search { "query": { "match": { "title": "Basics" } } } ``` #### 四、典型应用场景 - **全文检索**:支持模糊匹配、同义词扩展(需配置IK分词器[^1])。 - **日志分析**:结合Logstash实现实时日志采集与分析。 - **数据聚合**:统计电商商品销量分布或用户行为模式[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值