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.Value | int64 |
获取结果列表 | result.Hits.Hits | list |
获取单个结果 | result.Hits.Hits[0].Source | jsonStr |