ElasticSearch 7 DSL查询
在ElasticSearch中,搜索是通过基于JSON的查询来实现的。查询由两种子句组成:
叶查询子句:这些子句是匹配、术语或范围,它们在特定字段中查找特定值。
复合查询子句:这些查询是叶查询子句和其他复合查询的组合,以提取所需的信息。
ElasticSearch支持大数据量查询。查询以query关键字开始,然后以JSON对象的形式包含条件和过滤器。不同类型的查询描述如下
Match All查询
这是最基本的查询;它返回所有内容,每个对象的得分为1.0。例如,
POST /schools*/_search { "query":{ "match_all":{} } }
响应
{ "took":1, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0}, "hits":{ "total":5, "max_score":1.0, "hits":[ { "_index":"schools", "_type":"school", "_id":"2", "_score":1.0, "_source":{ "name":"Saint Paul School", "description":"ICSE Affiliation", "street":"Dawarka", "city":"Delhi", "state":"Delhi", "zip":"110075", "location":[28.5733056, 77.0122136], "fees":5000, "tags":["Good Faculty", "Great Sports"], "rating":"4.5" } }, { "_index":"schools_gov", "_type":"school", "_id":"2", "_score":1.0, "_source":{ "name":"Government School", "description":"State Board Affiliation", "street":"Hinjewadi", "city":"Pune", "state":"MH", "zip":"411057", "location":[18.599752, 73.6821995], "fees":500, "tags":["Great Sports"], "rating":"4" } }, { "_index":"schools", "_type":"school", "_id":"1", "_score":1.0, "_source":{ "name":"Central School", "description":"CBSE Affiliation", "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115", "location":[31.8955385, 76.8380405], "fees":2200, "tags":["Senior Secondary", "beautiful campus"], "rating":"3.3" } }, { "_index":"schools_gov", "_type":"school", "_id":"1", "_score":1.0, "_source":{ "name":"Model School", "description":"CBSE Affiliation", "street":"silk city", "city":"Hyderabad", "state":"AP", "zip":"500030", "location":[17.3903703, 78.4752129], "fees":700, "tags":["Senior Secondary", "beautiful campus"], "rating":"3" } }, { "_index":"schools", "_type":"school", "_id":"3", "_score":1.0, "_source":{ "name":"Crescent School", "description":"State Board Affiliation", "street":"Tonk Road", "city":"Jaipur", "state":"RJ", "zip":"176114", "location":[26.8535922, 75.7923988], "fees":2500, "tags":["Well equipped labs"], "rating":"4.5" } } ] } }
全文检索
这些查询用于搜索全文,如章节或新闻文章。该查询根据与特定索引或文档相关联的分析器工作。在本节中,我们将讨论不同类型的全文检索。
Match查询
此查询将文本或短语与一个或多个字段的值相匹配。例如,
POST /schools*/_search { "query":{ "match" : { "city":"pune" } } }
响应
{ "took":1, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0}, "hits":{ "total":1, "max_score":0.30685282, "hits":[{ "_index":"schools_gov", "_type":"school", "_id":"2", "_score":0.30685282, "_source":{ "name":"Government School", "description":"State Board Afiliation", "street":"Hinjewadi", "city":"Pune", "state":"MH", "zip":"411057", "location":[18.599752, 73.6821995], "fees":500, "tags":["Great Sports"], "rating":"4" } }] } }
multi_match查询
此查询将文本或短语与多个字段匹配。例如,
POST /schools*/_search { "query":{ "multi_match" : { "query": "hyderabad", "fields": [ "city", "state" ] } } }
响应
{ "took":16, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0}, "hits":{ "total":1, "max_score":0.09415865, "hits":[{ "_index":"schools_gov", "_type":"school", "_id":"1", "_score":0.09415865, "_source":{ "name":"Model School", " description":"CBSE Affiliation", "street":"silk city", "city":"Hyderabad", "state":"AP", "zip":"500030", "location":[17.3903703, 78.4752129], "fees":700, "tags":["Senior Secondary", "beautiful campus"], "rating":"3" } }] } }
Query String查询
该查询使用查询解析器和query_string关键字。例如,
POST /schools/_search { "query":{ "query_string":{ "query":"good faculty" } } }
响应
{ "took":16, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0}, "hits":{ "total":1, "max_score":0.09492774, "hits":[{ "_index":"schools", "_type":"school", "_id":"2", "_score":0.09492774, "_source":{ "name":"Saint Paul School", "description":"ICSE Affiliation", "street":"Dawarka", "city":"Delhi", "state":"Delhi", "zip":"110075", "location":[28.5733056, 77.0122136], "fees":5000, "tags":["Good Faculty", "Great Sports"], "rating":"4.5" } }] } }
Term查询
这些查询主要处理数字、日期等结构化数据。例如,
POST /schools/_search { "query":{ "term":{"zip":"176115"} } }
响应
{ "took":1, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0}, "hits":{ "total":1, "max_score":0.30685282, "hits":[{ "_index":"schools", "_type":"school", "_id":"1", "_score":0.30685282, "_source":{ "name":"Central School", "description":"CBSE Affiliation", "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115", "location":[31.8955385, 76.8380405], "fees":2200, "tags":["Senior Secondary", "beautiful campus"], "rating":"3.3" } }] } }
Range查询
该查询用于查找值在值范围之间的对象。为此,我们需要使用如下运算符
gte:大于等于
gt:大于
lte:小于等于
lt:小于
举个例子:
POST /schools*/_search { "query":{ "range":{ "rating":{ "gte":3.5 } } } }
响应
{ "took":31, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0}, "hits":{ "total":3, "max_score":1.0, "hits":[ { "_index":"schools", "_type":"school", "_id":"2", "_score":1.0, "_source":{ "name":"Saint Paul School", "description":"ICSE Affiliation", "street":"Dawarka", "city":"Delhi", "state":"Delhi", "zip":"110075", "location":[28.5733056, 77.0122136], "fees":5000, "tags":["Good Faculty", "Great Sports"], "rating":"4.5" } }, { "_index":"schools_gov", "_type":"school", "_id":"2", "_score":1.0, "_source":{ "name":"Government School", "description":"State Board Affiliation", "street":"Hinjewadi", "city":"Pune", "state":"MH", "zip":"411057", "location":[18.599752, 73.6821995] "fees":500, "tags":["Great Sports"], "rating":"4" } }, { "_index":"schools", "_type":"school", "_id":"3", "_score":1.0, "_source":{ "name":"Crescent School", "description":"State Board Affiliation", "street":"Tonk Road", "city":"Jaipur", "state":"RJ", "zip":"176114", "location":[26.8535922, 75.7923988], "fees":2500, "tags":["Well equipped labs"], "rating":"4.5" } } ] } }
其他类型的term级查询有:
Exists查询:判断某个字段具有非空值。
Missing查询:与Exists查询相反,该查询搜索没有特定字段或字段值为空的对象。
Wildcard or regexp查询:该查询使用正则表达式来查找对象中的模式。
Type query查询:特定类型的文档。例如,
POST /schools*/_search { "query":{ "type" : { "value" : "school" } } }
响应
指定索引中存在的所有school JSON对象。
复合查询
这些查询是通过使用布尔运算符(如and、or、not或for不同索引或具有函数调用等)彼此合并的不同查询的集合。例如,
POST /schools*/_search { "query":{ "filtered":{ "query":{ "match":{ "state":"UP" } }, "filter":{ "range":{ "rating":{ "gte":4.0 } } } } } }
响应
{ "took":16, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0}, "hits":{"total":0, "max_score":null, "hits":[]} }
Joining查询
这些查询用于包含多个映射或文档的情况。有两种类型的joining查询:
嵌套查询
这些查询处理嵌套映射(您将在下一章中了解更多)。
has_child和has_parent查询
这些查询用于检索在查询中匹配的文档的子文档或父文档。例如,
POST /tutorials/_search { "query": { "has_child" : { "type" : "article", "query" : { "match" : { "Text" : "This is article 1 of chapter 1" } } } } }
响应
{ "took":21, "timed_out":false, "_shards":{"total":5, "successful":5, "failed":0}, "hits":{ "total":1, "max_score":1.0, "hits":[{ "_index":"tutorials", "_type":"chapter", "_id":"1", "_score":1.0, "_source":{ "Text":"this is chapter one" } }] } }
地理位置查询
这些查询处理地理位置,这些查询有助于找到指定位置附近的学校或任何其他地点。您需要使用地理点数据类型。例如,
POST /schools*/_search { "query":{ "filtered":{ "filter":{ "geo_distance":{ "distance":"100km", "location":[32.052098, 76.649294] } } } } }
响应
{ "took":6, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0}, "hits":{ "total":2, "max_score":1.0, "hits":[ { "_index":"schools", "_type":"school", "_id":"2", "_score":1.0, "_source":{ "name":"Saint Paul School", "description":"ICSE Affiliation", "street":"Dawarka", "city":"Delhi", "state":"Delhi", "zip":"110075", "location":[28.5733056, 77.0122136], "fees":5000, "tags":["Good Faculty", "Great Sports"], "rating":"4.5" } }, { "_index":"schools", "_type":"school", "_id":"1", "_score":1.0, "_source":{ "name":"Central School", "description":"CBSE Affiliation", "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115", "location":[31.8955385, 76.8380405], "fees":2000, "tags":["Senior Secondary", "beautiful campus"], "rating":"3.5" } } ] } }
注意,如果在执行上述示例时出现异常,请将以下mapping添加到您的索引中。
{ "mappings":{ "school":{ "_all":{ "enabled":true }, "properties":{ "location":{ "type":"geo_point" } } } } }