Elasticsearch 索引与文档的常用操作总结二:复杂条件查询
本文为博主原创,未经允许不得转载:
1. 查询所有:match_all
GET /es_db/_doc/_search { "query":{ "match_all":{} } }
2.有查询条件
2.1 模糊匹配
模糊匹配主要是针对文本类型的字段,文本类型的字段会对内容进行分词,对查询时,也会对搜索条件进行分词,然后通过倒排索引查找到匹配的数据,模糊匹配主要通过match等参数来实现。
match : 通过match关键词模糊匹配条件内容,,模糊匹配,需要指定字段名,但是输入会进行分词
prefix : 前缀匹配
regexp : 通过正则表达式来匹配数据
match条件还支持以下参数:
query : 指定匹配的值
operator : 匹配条件类型
and : 条件分词后都要匹配
or : 条件分词后有一个匹配即可(默认)
minmum_should_match : 指定最小匹配的数量
根据备注信息模糊查询 match, match会根据该字段的分词器,进行分词查询
GET /es_db/_doc/_search { "from": 0, "size": 1, "query": { "match": { "address": "玄武湖公园" } } }
多字段模糊匹配查询与精准查询 multi_match
POST /es_db/_doc/_search { "query": { "multi_match": { "query": "张三", "fields": [ "address", "name" ] } } }
类比 mysql :
SQL: select * from student where name like '%张三%' or address like '%张 三%
2.2 精确匹配
term : 单个条件相等,,这个输入不会进行分词
terms : 单个字段属于某个值数组内的值
range : 字段属于某个范围内的值
exists : 某个字段的值是否存在
ids : 通过ID批量查询
根据名称精确查询姓名 term, term查询不会对字段进行分词查询,会采用精确匹配
注意: 采用term精确查询, 查询字段映射类型属于为keyword.
POST /es_db/_doc/_search { "query": { "term": { "name": "admin" } } }
2.3 组合条件查询
组合条件查询是将叶子条件查询语句进行组合而形成的一个完整的查询条件
constant_score : 不计算相关度评分
bool : 各条件之间有and,or或not的关系:
1.must : 各个条件都必须满足,即各条件是and的关系
2. should : 各个条件有一个满足即可,即各条件是or的关系
3. must_not : 不满足所有条件,即各条件是not的关系
4. filter : 不计算相关度评分,它不计算_score即相关度评分,效率更高
ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。另外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间。
must/filter/shoud/must_not 等的子条件是通过 term/terms/range/ids/exists/match 等叶子条件为参数的
查询示例:
POST /es_db/_doc/_search { "query": { "query_string": { "query": "admin OR 南京", "fields": [ "name", "address" ] } } }
分页、输出字段、排序综合查询
POST /es_db/_doc/_search { "query": { "range": { "age": { "gte": 25, "lte": 28 } } }, "from": 0, "size": 2, "_source": [ "name", "age", "book" ], "sort": { "age": "desc" } }