match匹配怎么当成布尔查询来使用

到现在为止,你可能已经意识到在一个布尔查询中多字段match查询仅仅包裹了已经生成的term查询。通过默认的or操作符,每个term查询都会像一个should子句一样被添加,只要有一个子句匹配就可以了。下面的两个查询是等价的:

  1. {
  2. "match": { "title": "brown fox"}
  3. }
  1. {
  2. "bool": {
  3. "should": [
  4. { "term": { "title": "brown" }},
  5. { "term": { "title": "fox" }}
  6. ]
  7. }
  8. }

通过and操作符,所有的term查询会像must子句一样被添加,因此所有的子句都必须匹配。下面的两个查询是等价的:

  1. {
  2. "match": {
  3. "title": {
  4. "query": "brown fox",
  5. "operator": "and"
  6. }
  7. }
  8. }
  1. {
  2. "bool": {
  3. "must": [
  4. { "term": { "title": "brown" }},
  5. { "term": { "title": "fox" }}
  6. ]
  7. }
  8. }

如果minimum_should_match参数被指定,match查询就直接被转换成一个bool查询,下面两个查询是等价的:

  1. {
  2. "match": {
  3. "title": {
  4. "query": "quick brown fox",
  5. "minimum_should_match": "75%"
  6. }
  7. }
  8. }
  1. {
  2. "bool": {
  3. "should": [
  4. { "term": { "title": "brown" }},
  5. { "term": { "title": "fox" }},
  6. { "term": { "title": "quick" }}
  7. ],
  8. "minimum_should_match": 2 <1>
  9. }
  10. }

<1>因为只有三个子句,所以 minimum_should_match参数在match查询中的值75%就下舍到了2。3个should子句中至少有两个子句匹配。

当然,我们通常写这些查询类型的时候还是使用match查询的,但是理解match查询在内部是怎么工作的可以让你在任何你需要使用的时候更加得心应手。有些情况仅仅使用一个match查询是不够的,比如给某些查询词更高的权重。这种情况我们会在下一节看个例子。