查询表达式 查询表达式(QueryDSL)是一种非常灵活又富有表现力的查询语言。Elasticsearch使用它可以以简单的JSON接口来展现Lucene功能的绝大部分。 要使用这种查询表达式,只需将查询语句传递给query参数:GETsearch{query:YOURQUERYHERE} 空查询(emptysearch){}在功能上等价于使用matchall查询,正如其名字一样,匹配所有文档:GETsearch{query:{matchall:{}}} 拷贝为curl在Sense中查看查询语句的结构 一个查询语句的典型结构:{QUERYNAME:{ARGUMENT:VALUE,ARGUMENT:VALUE,。。。}} 如果是针对某个字段,那么它的结构如下:{QUERYNAME:{FIELDNAME:{ARGUMENT:VALUE,ARGUMENT:VALUE,。。。}}} 举个例子,你可以使用match查询语句来查询tweet字段中包含elasticsearch的tweet:{match:{tweet:elasticsearch}} 完整的查询请求如下:GETsearch{query:{match:{tweet:elasticsearch}}}合并查询语句 查询语句(Queryclauses)就像一些简单的组合块,这些组合块可以彼此之间合并组成更复杂的查询。这些语句可以是如下形式:叶子语句(Leafclauses)(就像match语句)被用于将查询字符串和一个字段(或者多个字段)对比。复合(Compound)语句主要用于合并其它查询语句。比如,一个bool语句允许在你需要的时候组合其它语句,无论是must匹配、mustnot匹配还是should匹配,同时它可以包含不评分的过滤器(filters):{bool:{must:{match:{tweet:elasticsearch}},mustnot:{match:{name:mary}},should:{match:{tweet:fulltext}},filter:{range:{age:{gt:30}}}}} 一条复合语句可以合并任何其它查询语句,包括复合语句,了解这一点是很重要的。这就意味着,复合语句之间可以互相嵌套,可以表达非常复杂的逻辑。 例如,以下查询是为了找出信件正文包含businessopportunity的星标邮件,或者在收件箱正文包含businessopportunity的非垃圾邮件:{bool:{must:{match:{email:businessopportunity}},should:〔{match:{starred:true}},{bool:{must:{match:{folder:inbox}},mustnot:{match:{spam:true}}}}〕,minimumshouldmatch:1}}查询与过滤 Elasticsearch使用的查询语言(DSL)拥有一套查询组件,这些组件可以以无限组合的方式进行搭配。这套组件可以在以下两种情况下使用:过滤情况(filteringcontext)和查询情况(querycontext)。 当使用于过滤情况时,查询被设置成一个不评分或者过滤查询。即,这个查询只是简单的问一个问题:这篇文档是否匹配?。回答也是非常的简单,yes或者no,二者必居其一。created时间是否在2013与2014这个区间?status字段是否包含published这个单词?latlon字段表示的位置是否在指定点的10km范围内? 当使用于查询情况时,查询就变成了一个评分的查询。和不评分的查询类似,也要去判断这个文档是否匹配,同时它还需要判断这个文档匹配的有多好(匹配程度如何)。此查询的典型用法是用于查找以下文档:查找与fulltextsearch这个词语最佳匹配的文档包含run这个词,也能匹配runs、running、jog或者sprint包含quick、brown和fox这几个词词之间离的越近,文档相关性越高标有lucene、search或者java标签标签越多,相关性越高 一个评分查询计算每一个文档与此查询的相关程度,同时将这个相关程度分配给表示相关性的字段score,并且按照相关性对匹配到的文档进行排序。这种相关性的概念是非常适合全文搜索的情况,因为全文搜索几乎没有完全正确的答案。 自Elasticsearch问世以来,查询与过滤(queriesandfilters)就独自成为Elasticsearch的组件。但从Elasticsearch2。0开始,过滤(filters)已经从技术上被排除了,同时所有的查询(queries)拥有变成不评分查询的能力。 然而,为了明确和简单,我们用filter这个词表示不评分、只过滤情况下的查询。你可以把filter、filteringquery和nonscoringquery这几个词视为相同的。 相似的,如果单独地不加任何修饰词地使用query这个词,我们指的是scoringquery。性能差异 过滤查询(Filteringqueries)只是简单的检查包含或者排除,这就使得计算起来非常快。考虑到至少有一个过滤查询(filteringquery)的结果是稀少的(很少匹配的文档),并且经常使用不评分查询(nonscoringqueries),结果会被缓存到内存中以便快速读取,所以有各种各样的手段来优化查询结果。 相反,评分查询(scoringqueries)不仅仅要找出匹配的文档,还要计算每个匹配文档的相关性,计算相关性使得它们比不评分查询费力的多。同时,查询结果并不缓存。 多亏倒排索引(invertedindex),一个简单的评分查询在匹配少量文档时可能与一个涵盖百万文档的filter表现的一样好,甚至会更好。但是在一般情况下,一个filter会比一个评分的query性能更优异,并且每次都表现的很稳定。 过滤(filtering)的目标是减少那些需要通过评分查询(scoringqueries)进行检查的文档。如何选择查询与过滤 通常的规则是,使用查询(query)语句来进行全文搜索或者其它任何需要影响相关性得分的搜索。除此以外的情况都使用过滤(filters)。