数字广东网络建设有限公司地址/seo网络推广知识
1. 过滤
1.1 term 过滤
term 主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型):
1.2 terms 过滤
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配:
1.3 range 过滤
range 过滤允许我们按照指定范围查找一批数据:
1.4 exists 和 missing 过滤
exists 和 missing 过滤可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的 IS_NULL 条件
{ "exists":{"field":"title" }
}
这两个过滤只是针对已经查出一批数据来,但是想区分出某个字段是否存在的时候使用。
1.5 bool 过滤
bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含以下操作符:
- must :多个查询条件的完全匹配,相当于 and 。
- must_not :多个查询条件的相反匹配,相当于 not 。
- should :至少有一个查询条件匹配, 相当于 or 。
2. 查询
2.1 match_all 查询
使用 match_all 可以查询到所有文档,是没有查询条件下的默认语句。
此查询常用于合并过滤条件。 比如说你需要检索所有的邮箱,所有的文档相关性都是相同的,所以得到的 _score 为1
2.2 match 查询
match 查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析。
match 以下查询字符:
如果用 match 下指定了一个确切值,在遇到数字,日期,布尔值或者 not_analyzed 的字符串时,它将为你搜索你给定的值:
提示: 做精确匹配搜索时,你最好用过滤语句,因为过滤语句可以缓存数据
match 查询不可以用建议搜索,类似"+usid:2 +tweet:search"这样的语句。 它只能就指定 某个确切字段某个确切的值进行搜索
2.3 multi_match 查询
multi_match 查询允许你做 match 查询的基础上同时搜索多个字段:
2.4 bool 查询
bool 查询与 bool 过滤相似,用于合并多个查询子句。不同的是, bool 过滤可以直接给出是否匹配成功, 而 bool 查询 要计算每一个查询子句的 _score (相关性分值)。
- must : 查询指定文档一定要被包含。
- must_not : 查询指定文档一定不要被包含。
- should :查询指定文档,有则可以为文档相关性加分。
以下查询将会找到 title 字段中包含 “how to make millions”,并且 “tag” 字段没有被标为 spam 。 如果有标识为 “starred” 或者发布日期为2014年之前,那么这些匹配的文档将比同类网站等级高:
提示: 如果 bool 查询下没有 must 子句,那至少应该有一个 should 子句。但是 如果有 must 子句,那么没 有 should 子句也可以进行查询
3. 查询与过滤条件的合并
查询语句和过滤语句可以放在各自的上下文中。 在 ElasticSearch API 中我们会看到许多带有 query 或 filter 的语句。 这些语句既可以包含单条 query 语句,也可以包含一条 filter 子句。 换句话说,这些语句需要首先创建一 个 query 或 filter 的上下文关系。
复合查询语句可以加入其他查询子句,复合过滤语句也可以加入其他过滤子句。 通常情况下,一条查询语句需要过滤语句的 辅助,全文本搜索除外。
所以说,查询语句可以包含过滤子句,反之亦然。 以便于我们切换 query 或 filter 的上下文。这就要求我们在读懂需求的同 时构造正确有效的语句。
3.1 带过滤的查询语句
查询语句:
过滤语句:
search API中只能包含 query 语句,所以我们需要用 filtered 来同时包含 “query” 和 “filter” 子句:
我们在外层再加入 query 的上下文关系:
3.1.1 单条过滤语句
在 query 上下文中,如果你只需要一条过滤语句,比如在匹配全部邮件的时候,你可以 省略 query 子句:
如果一条查询语句没有指定查询范围,那么它默认使用 match_all 查询,所以上面语句 的完整形式如下:
3.2 带查询的过滤语句
有时候,你需要在 filter 的上下文中使用一个 query 子句。下面的语句就是一条带有查询功能 的过滤语句, 这条语句可以过 滤掉看起来像垃圾邮件的文档:
提示: 我们很少用到的过滤语句中包含查询,保留这种用法只是为了语法的完整性。 只有在过滤中用到全文本匹配的 时候才会使用这种结构
4. 验证查询
查询语句可以变得非常复杂,特别是与不同的分析器和字段映射相结合后,就会有些难度。
validate API 可以验证一条查询语句是否合法。
以上请求的返回值告诉我们这条语句是非法的:
4.1 理解错误信息
想知道语句非法的具体错误信息,需要加上 explain 参数:
很显然,我们把 query 语句的 match 与字段名位置弄反了:
4.2 理解查询语句
如果是合法语句的话,使用 explain 参数可以返回一个带有查询语句的可阅读描述, 可以帮助了解查询语句在ES中是如何 执行的:
explanation 会为每一个索引返回一段描述,因为每个索引会有不同的映射关系和分析器:
从返回的 explanation 你会看到 match 是如何为查询字符串 “really powerful” 进行查询的, 首先,它被拆分成两个独立 的词分别在 tweet 字段中进行查询。
而且,在索引 us 中这两个词为 “really” 和 “powerful” ,在索引 gb 中被拆分成 “really” 和 “power” 。 这是因为我们在索 引 gb 中使用了 english 分析器。