Elasticsearch 新手上路(二)——Query DSL查询
Query DSL
- Elasticsearch最常用的搜索方式是试用Query DSL进行搜索。学习一下。
主要参考:
《Elasticsearch :权威指南》中文版
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
查询
由于暂时不需要我插入创建索引类型插入文档,只需要用到查询,所以先写查询。
基础查询:
查询头
空查询:返回数据库里所有数据
GET /_search
{}
查询格式说明:上面一行的GET 是指查询,/_serach的位置是查询路径。
要在某一个或多个类型(表)里面查询的话,可以在_search前面写上路径。
GET /index*/type*/_search
{}
这里的index和table都可以用正则表示多个索引和类型(数据库和表),还可以用逗号分隔表示多个。例如 /table1,table2/_search或者 /tabel*/_search也是允许的。
查询参数介绍
在查询头下面使用json格式进行查询。
常用参数:
from:查询起点
size:返回查询文档的个数
sort:按照某一或多个字段排序,先按照写在前面的条件排,后面依次排序。
多值字段sort排序可以使用mode参数:min/max/avg/sum
- from和size可以用来对查询进行分页。
query参数:
query:具体的查询语句
- 具体的查询语句用json的形式存放在query里面。
- 一般来说非空查询一定有query。
一个简单的例子:
GET bid/_search { "from": 30, "size": 10, "sort": [ { "FIELD": { "order": "desc",
"mode": "min" } } ], "query": { "match_all": {} } } }
基础匹配方式:
- query参数下写的查询
term类查询:
- term类查询的特点是完全匹配查询,不进行分词,只有整个字段都一模一样才能匹配上。
- 比方说你要匹配“hello”,就不会匹配出"hello world",“hello!!!” 的条目,只有“hello”才会被匹配出来。
term查询:
GET /_search { "query": { #这部分写搜索的json,之后的查询语句都在这里 "term": { "FIELD(字段名)": { "value": "VALUE(匹配的值)" } } } } term的部分也可以写成: "term": { "FIELD":"VALUE" }
- 如果term查询不到,那可能是建表方式有问题,在建表时使用"index" : "not_analyzed"参数禁止分词就可以了。
terms查询:
- 和terms一样,但是允许进行多值匹配
"terms": { "FIELD": [ "VALUE1", "VALUE2" ] }
match类查询:
-
match类的匹配会对文字进行分词处理,利用倒排索引进行匹配。
match_all查询:
- 匹配所有文档
- 没有指定查询方式的时候是默认的查询
- 据说常配合filter使用。但是我没用过。
"match_all": {}
match查询:
- 普通分词匹配,使用中文时会将text按字进行分词,匹配所有带这个字的词。
- 例如输入“你好”,会将“ 你 今天吃 好 饭了吗”也匹配出来
"match": { "FIELD": "TEXT" }
match_phrase查询:
- 不分词,按照输入的短语来匹配,不拆分短语
- 输入“你好”时只匹配“你好,今天天气怎么样”,“我问你好不好”之类的你好连在一起的词。
"match_phrase": { "FIELD": "PHRASE" }
match_phrase_prefix查询:
- 和match_phrase差不多,按照前缀查询。常用于自动补全的检索
"match_phrase_prefix": { "FIELD": "PREFIX" }
multi_match查询:
- 允许匹配多个字段。
"multi_match": { "query": "TEXT", "fields": ["FIELD1","FIELD2"] }
range类查询:
- 可以处理int类型数字和时间日期等类型的范围,按照范围查询。
符号转换:
> gt
>= gte
< lt
<= lte
#20<=x<30
"range": { "age": { "gte": 20, "lt": 30 }
exists查询和missing查询:
- 用来处理那些有值或无值的文档。
- 相当于SQL的 IS_NULL 和 NOT IS_NULL
"exists": { "field": "title" }
组合多查询
- 在query下的参数
bool查询
- 使用bool参数将基础匹配组合起来进行查询
bool查询接受的参数:
must:文档必须包含的条件
must_not:文档必须不包含的条件
should:满足这些条件的话增加评分权重
filter:文档必须包含的条件,但是写在这里的过滤不影响权重评分,单纯过滤。
filter里面可以使用exists查询missing查询和range查询,不可以用普通的match等查询
"bool": { "must": [ {"match": { "FIELD": "TEXT" }} ], "should": [ {"match": { "FIELD": "TEXT" }} ] , "filter": {"exists": { "field": "FIELD_NAME" }} }
constant_score查询
- 专用于只有fliter的bool查询
"constant_score": { "filter": { "exists": { "field": "FIELD_NAME" } }, "boost": 1.2 }
先到这里,以后再更新。

浙公网安备 33010602011771号