Elasticsearch提供了丰富的查询语句DSL,查询可分2类:
- Leaf Query:查询特定字段特定值的查询,可以单独使用,比如match查询、term查询、range查询。
-
Compound Query:组合查询,组合多个简单查询或者特殊查询。
先占坑,有时间更新Y(^_^)Y
一、Query和Filter的区别
Query是真正的信息检索,会用到检索模型进行评分,回答的是查询和文档的匹配程度;Filter是过滤机制,回答的是Yes Or NO。
二、Match All Query
match all query会返回所有文档,文档的得分都是1。
GET /_search
{
"query": {
"match_all": {}
}
}
也可以通过boost参数修改得分:
GET /_search
{
"query": {
"match_all": { "boost" : 1.2 }
}
}
match_none是match_all的取反,不返回任何文档:
GET /_search
{
"query": {
"match_none": {}
}
}
三、Full Text Query(全文查询)
3.1 match query
GET /_search
{
"query": {
"match" : {
"message" : "this is a test"
}
}
}
message
是被搜索字段,this is a test
是query内容,分词后query中的任何一个关键字被匹配文档就会被搜索到。如果想查询匹配所有关键词的文档,可以用and操作符连接:
GET /_search
{
"query": {
"match" : {
"message" : {
"query" : "this is a test",
"operator" : "and"
}
}
}
}
3.2 match phrase query
match phrase query首先会把query内容分词,分词器可以自定义,同时文档还要满足以下两个条件才会被搜索到:
- 分词后到所有词项都要出现在该字段中
-
字段中到词项顺序要一致
例如,有三个文档:
{ "foo":"I just said hello world" }
{ "foo":"Hello world" }
{ "foo":"World Hello" }
使用match_phrase查询”hello world”:
{
"query": {
"match_phrase": {
"foo": "Hello World"
}
}
}
只有前2个文档会被匹配。
3.3 match phrase prefix query
match_phrase_prefix和match_phrase类似,只不过match_phrase_prefix支持最后一个term前缀匹配:
GET /_search
{
"query": {
"match_phrase_prefix" : {
"message" : "quick brown f"
}
}
}
3.4 multi match query
multi_match是match的升级,用于搜索多个字段:
GET books/_search
{
"query": {
"multi_match" : {
"query": "java虚拟机",
"fields": [ "title", "description" ],
"operator" : "and"
}
}
}
字段的名称可以使用通配符:
GET /_search
{
"query": {
"multi_match" : {
"query": "Will Smith",
"fields": [ "title", "*_name" ]
}
}
}
同时,也可以用指数符指定权重:
GET /_search
{
"query": {
"multi_match" : {
"query" : "this is a test",
"fields" : [ "subject^3", "message" ]
}
}
}