原文链接:http://blog.csdn.net/dm_vincent/article/details/41743955
match查询是如何使用bool查询的
现在,你也许意识到了使用了match
查询的多词查询只是简单地将生成的term
查询包含在了一个bool
查询中。通过默认的or
操作符,每个term
查询都以一个语句被添加,所以至少一个should
语句需要被匹配。以下两个查询是等价的:
{
"match": { "title": "brown fox"}
}
{
"bool": {
"should": [
{ "term": { "title": "brown" }},
{ "term": { "title": "fox" }}
]
}
}
使用and
操作符时,所有的term
查询都以must
语句被添加,因此所有的查询都需要匹配。以下两个查询是等价的:
{
"match": {
"title": {
"query": "brown fox",
"operator": "and"
}
}
}
{
"bool": {
"must": [
{ "term": { "title": "brown" }},
{ "term": { "title": "fox" }}
]
}
}
如果指定了minimum_should_match
参数,它会直接被传入到bool
查询中,因此下面两个查询是等价的:
{
"match": {
"title": {
"query": "quick brown fox",
"minimum_should_match": "75%"
}
}
}
{
"bool": {
"should": [
{ "term": { "title": "brown" }},
{ "term": { "title": "fox" }},
{ "term": { "title": "quick" }}
],
"minimum_should_match": 2
}
}
因为只有3个查询语句,minimum_should_match
的值75%
会被向下舍入到2
。即至少两个should语句需要匹配。
当然,我们可以通过match
查询来编写这类查询,但是理解match
查询的内部工作原理能够让你根据需要来控制该过程。有些行为无法通过一个match
查询完成,比如对部分查询词条给予更多的权重。在下一节中我们会看到一个例子。
提升查询子句(Boosting Query Clause)
当然,bool
查询并不是只能合并简单的单词(One-word)match
查询。它能够合并任何其它的查询,包括其它的bool
查询。它通常被用来通过合并数个单独的查询的分值来调优每份文档的相关度_score
。
假设我们需要搜索和"full-text search"相关的文档,但是我们想要给予那些提到了"Elasticsearch"或者"Lucene"的文档更多权重。更多权重的意思是,对于提到了"Elasticsearch"或者"Lucene"的文档,它们的相关度_score
会更高,即它们会出现在结果列表的前面。
一个简单的bool查询能够让我们表达较为复杂的逻辑:
GET /_search
{
"query": {
"bool": {
"must": {
"match": {
"content": {
"query": "full text search",
"operator": "and"
}
}
},
"should": [
{ "match": { "content": "Elasticsearch" }},
{ "match": { "content": "Lucene" }}
]
}
}
}
-
content
字段必须含有full
,text
和search
这三个词条 - 如果
content
字段也含有了词条Elasticsearch
或者Lucene
,那么该文档会有一个较高的_score
should
查询子句的匹配数量越多,那么文档的相关度就越高。目前为止还不错。
但是如果我们想给含有Lucene
的文档多一些权重,同时给含有Elasticsearch
的文档更多一些权重呢?
我们可以通过指定一个boost
值来控制每个查询子句的相对权重,该值默认为1
。一个大于1
的boost
会增加该查询子句的相对权重。因此我们可以将上述查询重写如下:
GET /_search
{
"query": {
"bool": {
"must": {
"match": {
"content": {
"query": "full text search",
"operator": "and"
}
}
},
"should": [
{ "match": {
"content": {
"query": "Elasticsearch",
"boost": 3
}
}},
{ "match": {
"content": {
"query": "Lucene",
"boost": 2
}
}}
]
}
}
}
NOTE
boost
参数被用来增加一个子句的相对权重(当boost
大于1
时),或者减小相对权重(当boost
介于0
到1
时),但是增加或者减小不是线性的。换言之,boost
设为2
并不会让最终的_score
加倍。相反,新的
_score
会在适用了boost
后被归一化(Normalized)。每种查询都有自己的归一化算法(Normalization Algorithm),算法的细节超出了本书的讨论范围。但是能够说一个高的boost
值会产生一个高的_score
。如果你在实现你自己的不基于TF/IDF的相关度分值模型并且你需要对提升过程拥有更多的控制,你可以使用
function_score
查询,它不通过归一化步骤对文档的boost
进行操作。
在下一章中,我们会介绍其它的用于合并查询的方法,多字段查询(Multifield Search)。但是,首先让我们看看查询的另一个重要特定:文本分析(Text Analysis)。
相关推荐
全文搜索是Elasticsearch的一大优势,其通过分析器和搜索分析器对文本进行处理,使得用户能够执行更复杂的查询,比如模糊匹配、短语匹配和邻近度查询等,从而在海量数据中找到最相关的结果。这使得Elasticsearch成为...
总结来说,Elasticsearch的`match`查询在内部使用了`bool`和`term`查询的组合,通过调整`should`、`must`子句以及`minimum_should_match`参数,可以灵活地控制搜索的精确度和召回率,从而满足不同的搜索需求。...
在 Elasticsearch 中,查询可以分为两种上下文:查询上下文和过滤器上下文。查询上下文用于计算文档的相关性得分,回答问题“此文档与该查询子句的匹配程度如何?”查询子句在查询上下文中计算相关性得分,影响文档...
ElasticSearch 是一款基于 Lucene 的分布式搜索和分析引擎,适用于全文检索、结构化检索及分析等场景。它提供了丰富的 API 接口,允许用户通过简单的 RESTful 方式来管理数据,并进行复杂的查询操作。 在 Elastic...
Elasticsearch 作为一款基于 Lucene 构建的开源、分布式、RESTful 风格的搜索和分析引擎,凭借其卓越的性能和丰富的功能,在处理大量数据的搜索、分析和存储任务方面脱颖而出。 #### Elasticsearch 关键特点 1. **...
在Elasticsearch中,查询是检索数据的核心操作,本笔记主要介绍了多种查询方式,帮助我们更有效地从索引中获取匹配的数据。 1. **全部查询**: 使用`match_all`查询可以返回索引中的所有文档。在示例中,GET请求`...
在本项目中,我们探索如何使用Elasticsearch(ES)构建一个简单的检索式问答系统,同时结合Python进行数据处理和查询操作。Elasticsearch是一种分布式、实时的搜索和分析引擎,广泛应用于日志分析、信息检索、全文...
在大数据时代,Elasticsearch 作为一款强大的搜索引擎,因其高效全文检索、实时分析及大数据处理能力而备受青睐。本笔记主要涵盖以下几个核心知识点: 1. **结构化搜索实战**: - 使用 `term filter` 进行精确匹配...
`bool`查询允许用户结合`must`(必须满足)、`should`(建议满足)、`must_not`(不能满足)和`filter`(过滤条件)等子句,构建逻辑关系复杂的查询。`function_score`查询则可以基于评分函数来调整搜索结果的排序,...
8. **使用DSL测试布尔查询**: 布尔查询 (`bool` 查询) 允许组合多个条件来构建复杂的查询逻辑,支持 `must`, `should`, 和 `must_not` 子句。 9. **测试过滤器**: Elasticsearch 支持多种过滤器,如 `term`, `...
在本实验中,我们将探讨如何使用Elasticsearch进行索引和文档操作。Elasticsearch是一个强大的开源搜索引擎...实验不仅锻炼了基本操作技能,还涵盖了复杂的查询和聚合功能,有助于提升对Elasticsearch的实际应用能力。
Elasticsearch 是一个流行的开源全文搜索引擎,基于 Lucene 库,提供了分布式、实时、可扩展的搜索和分析能力。在 Python 中与 Elasticsearch 交互,我们通常使用官方提供的 `elasticsearch-py` 客户端库。本教程将...
在Elasticsearch中,DSL由两种类型的子句组成:叶子查询子句和复合查询子句。叶子查询子句专注于特定字段的单个值,如匹配、术语或范围查询,而复合查询子句则可以组合其他查询,以实现逻辑上的条件组合,如布尔查询...