全文搜索 (三) - match查询和bool查询的关系,提升查询子句
2017-05-31 10:59
351 查看
转自: 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] 全文搜索 (三) - match查询和bool查询的关系,提升查询子句
- [Elasticsearch] 全文搜索 (三) - match查询和bool查询的关系,提升查询子句
- [Elasticsearch] 全文搜索 (三) - match查询和bool查询的关系,提升查询子句
- [Elasticsearch] 全文搜索 (三) - match查询和bool查询的关系,提升查询子句
- [Elasticsearch] 全文搜索 (一) 基础概念和match查询
- MySQL学习笔记----子查询、联结表、组合查询、全文本搜索
- [Elasticsearch] 多字段搜索 (三) - multi_match查询和多数字段
- Match全文搜索
- Mysql全文搜索match…against的用法
- HubbleDotNet 开源全文搜索数据库项目--Match 方式
- [Elasticsearch] 多字段搜索 (三) - multi_match查询和多数字段
- [Elasticsearch] 全文搜索 (二) - 多词查询及查询的合并
- Microsoft OLE DB Provider for SQL Server 错误 '80040e14' 全文操作运行失败。查询子句只包含被忽略的词。
- sql server中随即搜索出几条数据 全文,取前记录,查询前
- Mysql全文本检索-MyISM引擎,Where子句中使用Match() Against()-布尔模式
- [Elasticsearch] 全文搜索 (二) - 多词查询及查询的合并
- HubbleDotNet开源全文搜索数据库项目--查询方法汇总 ——>eaglet
- HubbleDotNet开源全文搜索数据库项目--查询方法汇总
- 全文搜索---Solr(它与lucene的关系)
- 基于倒排索引的关系数据库全文检索查询效率研究