ES专题 - 使用(新手篇)

1 ES介绍

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

2 ES特点

  • 支持多种数据类型
  • 支持多种匹配(精确匹配、模糊匹配、不匹配)
  • 支持排序
  • 支持分页
  • 支持匹配打分

3 ES 相关名词

  • settings:用于设置主副分片数
  • mappings:模版,用于设置字段和类型
  • Index:索引(类比mysql的database),存储拥有相同结构文档的集合
  • type:类型(类比mysql的table),7.x已废弃
  • id:标识id(类比mysql的行编号),可以自动也可以设定
  • 使用index、type、id可以唯一确定一个文档(类比mysql的一条行记录)
  • version:文档版本
  • 分析器:可以在mappings中制定字段的分析器,在查询和匹配的时候会根据分析器进行匹配

4 ES 查询

4.1 ES查询形式

ES是通过SEarch API在HTTP请求体发送查询表达式(Query DSL,Domain Specific Language)来实现灵活、复杂的查询。
格式:query是Query DSL,与query同级的参数还有from、size、timeout等

GET /${index}/_search
{
    "query":{
        ${parameters}
    }
}

4.2 ES match 查询

优先使用filter查询,参考文档:query-dsl-bool-query
match查询是一个标准查询,不管需要全文本查询还是精确查询基本都会用到它,如果用match查询一个全文本字段,它会在真正查询之前用分析器先分析一下查询字符:

{
    "match":  {
        "name": "zhangsan"
    }
}

4.3 ES term 过滤

term主要用于精确匹配,比如数字、日期、布尔值或者not_analyzed的字符串:

{
    "term": {
        "age": 20
    }
}

4.4 ES terms 过滤

terms主要用于精确匹配多值,比如数字、日期、布尔值或者not_analyzed的字符串:

{
    "terms": {
        "age": [20, 21, 22]
    }
}

4.5 ES range 过滤

range过滤用于在指定范围内查找一批数据:

{
    "range": {
        "age": {
            "get": 20,
            "lt": 30
        }
    }
}

4.6 ES Bool 过滤

  • bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含以下操作:
  • must:多个查询条件的完全匹配,相当于and
  • must_not:多个查询条件的相反匹配,相当于not
  • should:至少有一个查询条件匹配,相当于or
{
    "bool": {
        "must": {"term": {"folder": "inbox"}},
        "must_not": {"term": {"tag": "span"}},
        "should": [
            {"term": {"starred": true}},
            {"term": {"unread": true}}
        ]
    }
}

4.7 ES Bool查询

bool查询与bool过滤相似,用于合并多个查询子句,不同的是,bool过滤可以直接给出是否匹配成功,而bool查询要计算每一个查询子句的_score(相关性分值)。
must:查询指定文档一定要被包含
must_not:查询指定文档一定不要被包含
should:查询指定文档,有则可以为文档相关性加分

filter:
{
    "bool": {
        "must": {"match": {"folder": "inbox"}},
        "must_not": {"match": {"tag": "span"}},
        "should": [
            {"match": {"starred": true}},
            {"match": {"unread": true}}
        ]
    }
}

注:如果bool查询下没有must子句,那至少应该有一个should子句;但是如果有must子句,那么没有should子句也可以进行查询;当must和should都存在时,should条件可以完全不匹配,建议设置minimum_should_match

5 ES SDK

5.1 Bool 过滤

query := elastic.NewBoolQuery().
       Must(elastic.NewTermQuery("id", inParams["id"].(int64)))

5.2 Bool 查询

query := elastic.NewBoolQuery().
       Must(elastic.NewMatchQuery("id", inParams["id"].(int64)))

5.3 Sort 语句

sort := elastic.NewFieldSort(inParams["sort_field"].(string))
if inParams["sort_direct"].(string) == "asc" {
       sort.Asc()
} else {
       sort.Desc()
}

5.4 包含字段查询

fsc := elastic.NewFetchSourceContext(true).Include("id", "name")

5.5 查询

result, err = cli.
       Search(indexName).
       Query(query).
       From(0).
       Size(10)).
       SortBy(sort).
       FetchSourceContext(fsc).
       TimeoutInMillis(500).
       Do(ctx)

5.6 返回结果

获取总数result.Hits.TotalHits.Valueint64
获取结果列表result.Hits.Hitslist
获取单个结果result.Hits.Hits[0].SourcejsonStr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值