ES可以使用URI或DSL进行查询
URI
GET /megacorp/employee/_search?q=last_name:Smith
由于DSL可以提供更多功能,以及可视化更好,一般都使用DSL进行查询
一个典型的DSL查询结构
"query" :{
"match": {
"last_name": "Smith"
}
}
常用的查询方法:
match_all:简单的匹配所有文档,是默认查询方式
match:在执行查询前,使用分析器去分析查询字符串
multi_match:可以在多个字段上执行相同的match查询
match_phrase:短语查询,不对查询字符串进行分析
range:查询区间内的数字或者时间
term:精确值查询,常用于数字、时间、布尔值
terms:与term一样,允许指定多个值进行匹配
exists:是否存在
missing:是否确实
组合查询(多个查询条件)
"query" :{
"bool": {
"must": { "match": { "tweet": "elasticsearch" }},
"must_not": { "match": { "name": "mary" }},
"should": { "match": { "tweet": "full text" }},
"filter": { "range": { "age" : { "gt" : 30 }} }
}
}
must:文档必须匹配这些条件才能被包含进来
must_not:文档必须不包含这些条件才能包含进来
should:若匹配这些条件,可以增加_score,主要用于修正相关性得分
filter:必须匹配,但以过滤模式来进行,对评分没有贡献
查询组件包含:过滤与查询两个模式,并可以无限搭配
使用查询时,是一个评分查询,返回匹配率
当使用过滤时,不进行评分,返回YES OR NO
一般情况下,过滤比查询性能更优(查询需要匹配外,还需要计算相关性);通常的规则是,使用查询语句进行全文搜索或者其他需要影响相关性得分的搜索,除此之外使用过滤
参考:https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/full-body-search.html