程序员人生 网站导航

[Elasticsearch] 全文搜索 (三) - match查询和bool查询的关系,提升查询子句

栏目:框架设计时间:2015-01-04 09:52:14

match查询是如何使用bool查询的

现在,你或许意想到了使用了match查询的多词查询只是简单地将生成的term查询包括在了1个bool查询中。通过默许的or操作符,每一个term查询都以1个语句被添加,所以致少1个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查询的内部工作原理能够让你根据需要来控制该进程。有些行动没法通过1个match查询完成,比如对部份查询词条给予更多的权重。在下1节中我们会看到1个例子。



提升查询子句(Boosting Query Clause)

固然,bool查询其实不是只能合并简单的单词(One-word)match查询。它能够合并任何其它的查询,包括其它的bool查询。它通常被用来通过合并数个单独的查询的分值来调优每份文档的相干度_score

假定我们需要搜索和"full-text search"相干的文档,但是我们想要给予那些提到了"Elasticsearch"或"Lucene"的文档更多权重。更多权重的意思是,对提到了"Elasticsearch"或"Lucene"的文档,它们的相干度_score会更高,即它们会出现在结果列表的前面。

1个简单的bool查询能够让我们表达较为复杂的逻辑:

GET /_search { "query": { "bool": { "must": { "match": { "content": { "query": "full text search", "operator": "and" } } }, "should": [ { "match": { "content": "Elasticsearch" }}, { "match": { "content": "Lucene" }} ] } } }
  1. content字段必须含有fulltextsearch这3个词条
  2. 如果content字段也含有了词条ElasticsearchLucene,那末该文档会有1个较高的_score

should查询子句的匹配数量越多,那末文档的相干度就越高。目前为止还不错。

但是如果我们想给含有Lucene的文档多1些权重,同时给含有Elasticsearch的文档更多1些权重呢?

我们可以通过指定1个boost值来控制每一个查询子句的相对权重,该值默许为1。1个大于1boost会增加该查询子句的相对权重。因此我们可以将上述查询重写以下:

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参数被用来增加1个子句的相对权重(当boost大于1时),或减小相对权重(当boost介于01时),但是增加或减小不是线性的。换言之,boost设为2其实不会让终究的_score加倍。

相反,新的_score会在适用了boost后被归1化(Normalized)。每种查询都有自己的归1化算法(Normalization Algorithm),算法的细节超越了本书的讨论范围。但是能够说1个高的boost值会产生1个高的_score

如果你在实现你自己的不基于TF/IDF的相干度分值模型并且你需要对提升进程具有更多的控制,你可使用function_score查询,它不通过归1化步骤对文档的boost进行操作。

在下1章中,我们会介绍其它的用于合并查询的方法,多字段查询(Multifield Search)。但是,首先让我们看看查询的另外一个重要特定:文本分析(Text Analysis)。


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐