java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > ElasticSearch搜索入门

搜索一文入门ElasticSearch(节点 分片 CRUD 倒排索引 分词)

作者:stark张宇

这篇文章主要为大家介绍了搜索一文入门ElasticSearch(节点 分片 CRUD 倒排索引 分词)的基础详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

ElasticSearch

ElasticSearch是非常重要的检索工具,利用分词、索引(倒排索引)、分词从众多检索工具中脱颖而出,本章是入门基础学习篇内容。

基本概念:索引、文档和REST Api

ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位

文档会被序列化成Josn格式,保存在ElasticSearch中

每个文档都有一个UniqueID

你可以自己指定ID

或者通过ElasticSearch自动生成

Json文档

文档的元数据

{
    "_index" : ".kibana_1",
    "_type" : "_doc",
    "_id" : "space:default",
    "_score" : 1.0,
    "_source" : {
        "space" : {
        "name" : "默认值",
        "description" : "这是您的默认空间!",
        "color" : "#00bfb3",
        "_reserved" : true
        },
        "type" : "space",
        "references" : [ ],
        "updated_at" : "2022-05-13T09:16:16.465Z"
    }
}

索引

//查看索引相关信息
GET kibana_sample_data_ecommerce
//查看索引的文档总数
GET kibana_sample_data_ecommerce/_count
//查看前10条文档,了解文档格式
POST kibana_sample_data_ecommerce/_search
{
}
//_cat indices API
//查看indices
GET /_cat/indices/kibana*?v&s=index
//查看状态为绿的索引
GET /_cat/indices?v&health=green
//按照文档个数排序
GET /_cat/indices?v&s=docs.count:desc
//查看具体的字段
GET /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs.count,mt
//How much memory is used per index?
GET /_cat/indices?v&h=i,tm&s=tm:desc

分布式系统的可用性和扩展性

分布式特性

节点

分片

{
    "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 1
    }
}

查看集群的健康状况

CRUD

1.使用PostMan创建一个名字叫stark的索引

http://127.0.0.1:9200/stark?pretty
// 返回值
{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "stark"
}

文档的CRUD

Create 一个文档

支持自动生成文档ID和指定文档ID两种方式:

GET 一个文档

GET http://127.0.0.1:9200/IndexName/_doc/ID

Index 文档

PUT IndexName/_doc/1
{
    "tags":["name","age","sex"]
}

Index和Create不一样的地方:如果文档存在,就索引新的文档。否则现有文档会被删除,新的文档被索引,版本信息(Version) + 1。

Update 文档

Update方法不会删除原来的文档,而是实现真正的数据更新,POST方法 ,Payload需要包含在doc中。

POST IndexNmae/_update/1
{
    "doc":{
        "albums":["aaa","bbb"]
    }
}

删除文档

DELETE IndexName/_doc/ID

Bulk API / 批量读取 mGet / 批量查询 msearch

Bulk Api 支持在一次Api调用中,对不同的索引进行操作,支持四种类型操作,Index\Create\Update\Delete。

可以在URI中指定Index,也可以在请求的Payload中进行,操作单挑操作失败,并不影响其他操作,返回结果包括了每一条操作执行的结果。

//对同一个索引进行操作
POST /IndexName/_doc/_bulk 
//对不同的索引进行操作
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test2", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }

mGet批量操作,可以减少网络链接所产生的开销,提高性能。

#URI中指定index
GET /IndxName/_mget
{
    "docs" : [
        {
            "_id" : "1"
        },
        {
            "_id" : "2"
        }
    ]
}
//对不同的索引进行操作
GET /_mget
{
    "docs" : [
        {
            "_index" : "test",
            "_id" : "1"
        },
        {
            "_index" : "test",
            "_id" : "2"
        }
    ]
}

批量查询 msearch

// msearch 操作
POST kibana_sample_data_ecommerce/_msearch
{"query" : {"match_all" : {}},"size":1}
{"index" : "kibana_sample_data_flights"}
{"query" : {"match_all" : {}},"size":2}

倒排索引

倒排索引的核心组成

Es的倒排索引

Analysis 与 Analyzer

Analyzer的组成

Search Api

1.指定查询的索引

集群上所有的索引:

GET /_search //集群上所有的索引
GET /Index1/_search  //index1
GET /Index1,Index2/_search  //index1和index2
GET /index*/_search  //以index开头的索引

2.URI查询

用q表示查询内容,搜索叫做stark的客户GET /IndexName/_search?q=keyName:stark

3.Request Body

Request Body 支持 POST/GET两种方法,-H代表的是header参数 -d 代表的是body的请求参数。

curl -XGET "http://127.0.0.1:9200/IndexName/_search"
-H 'Content-Type:application/json' 
-d
'
{
 "query":{
     "match_all":{}
 }    
}
'

4.搜索Response

搜索Response有几个关键的描述需要在这里解释一下:

URI Search详解

指定字段查询 Vs 泛查询

q是关键字,df是指定字段,泛查询就是查询所有字段中包含关键字的结果

//指定字段
GET /IndexName/_search?q=2020&df=title
GET /IndexName/_search?q=title:2020
{
    "profile":"true"
}
//泛查询
GET /IndexName/_search?q=2020
{
    "profile":"true"
}

Term Vs Phrase

Hello World 等效于 Hello Or World

"Hello World",等效于Hello AND World 。Phrase查询,还要求前后顺序保持一致

分组和引号

//分组,Bool查询
GET /IndexName/_search?q=title:(Hello World)
{
    "profile":"true"
}
//泛查询
GET /IndexName/_search?q=title:Hello World
{
    "profile":"true"
}

布尔操作 、分组

//检索title里有Hello ,没有World的词条
GET /IndexName/_search?q=title:(Hello NOT World)
{
    "profile":"true"
}
//检索title里必须有Hello ,必须没有World的词条
GET /IndexName/_search?q=title:(+Hello -World)
{
    "profile":"true"
}

范围查询 、算术符号

URI Search支持范围查询和算术符号查询。

GET /IndexName/_search?q=year:>2020
{
    "profile":"true"
}

通配符查询 、正则表达式 、模糊匹配与近似查询

通配符查询 、正则表达式 、模糊匹配与近似查询效率低,占用内存大,不建议使用,这部分大家有个了解就好。

以上就是搜索一文入门ElasticSearch(节点 分片 CRUD 倒排索引 分词)的详细内容,更多关于ElasticSearch搜索入门的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文