ES在查询的时候非常方便,
笔者总结了Es的基础查询操作,供大家指正和学习。
match_all
全部查询,配合其他的操作进行数据的筛选,字段的筛选等,并且伴随着条件的增加,建议使用POST方式,
POST /index/_search
{
"query": {
"match_all": {}
}
}
筛选字段
_source对需要的字段进行筛选。
分页
from a size b 拿到目的集合中索引为a到b的数据。
{
"query": {
"match_all": {}
},
"_source": [
"id",
"nickname",
"age"
],
"from": 0,
"size": 10
}
排序
text类型无法排序,keyword类型可以,对于text,可以用它的.keyword进行排序,
"sort": [
{
"age": "asc"
},
{
"money": "desc"
}
]
must
需要满足条件列表中的所有
term/terms
不进行分词搜索,仅仅支持一个字段的筛选,筛选出包含该字符的数据。
term精确匹配,不会进行分词。
terms则表示根据一个列表进行匹配。
对于text文本的信息,能够进行分词,则使用包含搜索信息分词的就能被成功筛选。
然而text类型也有个keyword,不支持分词,其值也text文本内容,用keyword需要全量输入搜索信息才能被成功筛选。
参考:https://blog.csdn.net/dg19971024/article/details/107103201
{
"query": {
"terms":{
"name1":"霸王别姬"
}
"terms": {
"name1.keyword": ["霸王别姬","肖申克的救赎"]
}
}
}
match
在查询时,是进行了分词的操作。查询包含某字符分词结果数据的信息。查询也有正则和前缀查询到时候搜。
对于查询的时候,如果是text类型,也可以使用它的.keyword进行相关查询,具体情况具体分析。
例如:我是你爸爸,被分词为 我,是,你,爸爸,筛选结果会是包含其分词结果的数据(具体条件可以定义)。
{
"query": {
"match": {
"name1": {
"query": "我是你爸爸",
"boost": 2
}
}
}
}
具体条件约束
名词 | 选择 | 说明 |
---|---|---|
operator | “or”/“and” | 如我爱你,被分词我,爱,你,那么or的话含有任意一个分词就行,and则是需要都包含 |
minimum_should_match | 一个百分数percent | 目标字符串被分为n个词,筛选出出来的数据会包含n*percent个字符 |
boost | 权重,不设置为1,提高权重设大于1的整数。 |
multi_match
多字段匹配,可以在每个字段后面添加^n,指定权重。各个字段也可以使用*代替前缀或者后缀。
POST /movie/_search
{
"query": {
"multi_match": {
"query": "我是你爸爸",
"fields": [
"name1^2",
"*_content"
],
"type": "cross_fields"
}
}
}
参数
type
值 | 说明 |
---|---|
best_fields | 按照match检索,所有字段单独计算得分并取最高分的field为最终_score,虽然是默认值,但不建议使用,数据量上来后查询性能会下降 |
most_fields | 按照match检索,融合所有field得分为最终_score |
cross_fields | 将fields中的所有字段融合成一个大字段进行match检索,此时要求所有字段使用相同分析器 |
Phrase | 按照match_phrase检索,默认slop为0,执行短语精确匹配,所以即便设置 minimum_should_match 也无效; 取最高字段得分 |
phrase_prefix | 按照match_phrase_prefix检索,滑动步长slop默认为0;取最高字段得分 |
bool_prefix | 按照match_bool_prefix检索 |
tie_breaker
取值范围0-1,当type使用默认值 best_fields ,tie_breaker将会改变默认_score计算方式,采用best_field_score + tie_breaker*other_field_score。
analyzer
用户搜索输入词采用哪种解析器进行分词,默认使用mapping阶段指定的分词器;如果analyzer设置和索引阶段的分词器不一致时,且operator为and 那么在执行查询时可能理应完全匹配的短语结果检索为空的情况。
fuzziness
指定模糊程度,支持数字或auto
prefix_length
当使用模糊查询时,用来指定前缀不变长度
lenient
当查询报错时是否忽略该文档,默认为false
operator
匹配关系的逻辑判断,默认为or,当为and时表示所有输入词必须完全匹配
minimum_should_match
该参数生效的前提是operator为or,支持数字、百分比或者混合配置,
zero_terms_query
当用户输入词全部为停用词时是否返回文档,默认为none即不返回数据,设置为all时,查询将被改写为match_all
auto_generate_synonyms_phrase_query
是否开启同义词查询,默认为true
组合查询
must
是指要同时满足多个条件
should
满足一个条件就行。
must_not
都不满足。
filter
四者可以同时使用,里面都是方term/match
{
"query": {
"bool": {
"must": [
{
"match": {
"desc": "大学"
}
}
],
"must_not": [
{
"term": {
"sex": "1"
}
}
],
"should": [
{
"range": {
"age": {
"gt": "18",
"lt": "22"
}
}
},
{
"match": {
"desc": "毕业"
}
}
]
}
}
}
过滤查询
进行范围筛选文章来源:https://www.toymoban.com/news/detail-411640.html
{
"query": {
"match": {
"desc": "大学"
}
},
"post_filter": {
"range": {
"money": {
"gt": 100,
"lt": 1000
}
}
}
}
高亮
将目标字符创高亮文章来源地址https://www.toymoban.com/news/detail-411640.html
{
"query": {
"match": {
"desc": "沙僧"
}
},
"highlight": {
"pre_tags": [
"<span>"
],
"post_tags": [
"</span>"
],
"fields": {
"desc": {}
}
}
}
到了这里,关于一文掌握系列之Es的DSL查询操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!