跨度查询

edit

跨度查询是低级别的位置查询,提供了对指定术语的顺序和接近度的专家控制。这些通常用于在法律文件或专利上实现非常具体的查询。

只允许在外部span查询上设置boost。复合span查询,如span_near,仅使用内部span查询的匹配span列表来查找它们自己的span,然后使用这些span来生成分数。分数永远不会在内部span查询上计算,这就是不允许设置boost的原因:它们只会影响分数的计算方式,而不会影响span。

跨度查询不能与非跨度查询混合使用(span_multi 查询除外)。

本组中的查询包括:

span_containing query
接受一个跨度查询列表,但仅返回那些也匹配第二个跨度查询的跨度。
span_field_masking query
允许跨不同字段的查询,如 span-nearspan-or
span_first query
接受另一个跨度查询,其匹配项必须出现在字段的前N个位置内。
span_multi query
包装一个termrangeprefixwildcardregexpfuzzy查询。
span_near query
接受多个跨度查询,其匹配项必须在指定距离内,并且可能按相同顺序排列。
span_not query
包装另一个span查询,并排除任何匹配该查询的文档。
span_or query
组合多个跨度查询——返回匹配任何指定查询的文档。
span_term query
term查询等效,但用于其他跨度查询。
span_within query
单个跨度查询的结果只要其跨度位于其他跨度查询列表返回的跨度内,就会返回。

包含查询

edit

返回包含另一个跨度查询的匹配项。以下是一个示例:

GET /_search
{
  "query": {
    "span_containing": {
      "little": {
        "span_term": { "field1": "foo" }
      },
      "big": {
        "span_near": {
          "clauses": [
            { "span_term": { "field1": "bar" } },
            { "span_term": { "field1": "baz" } }
          ],
          "slop": 5,
          "in_order": true
        }
      }
    }
  }
}

The biglittle 子句可以是任何跨度类型查询。包含来自 little 匹配的 big 匹配项将被返回。

跨字段掩码查询

edit

包装器,允许跨度查询通过虚假其搜索字段来参与复合单字段跨度查询。

这可以用于支持跨不同字段的查询,如 span-nearspan-or,这在一般情况下是不允许的。

跨字段掩码查询在与多字段结合使用时非常有价值,尤其是在使用多个分析器对相同内容进行索引时。例如,我们可以使用标准分析器对字段进行索引,该分析器将文本拆分为单词,并再次使用英语分析器,该分析器将单词词干化为它们的根形式。

示例:

GET /_search
{
  "query": {
    "span_near": {
      "clauses": [
        {
          "span_term": {
            "text": "quick brown"
          }
        },
        {
          "span_field_masking": {
            "query": {
              "span_term": {
                "text.stems": "fox" 
              }
            },
            "field": "text" 
          }
        }
      ],
      "slop": 5,
      "in_order": false
    }
  },
  "highlight": {
    "require_field_match" : false, 
    "fields": {
      "*": {}
    }
  }
}

我们进行搜索的原始字段

掩码字段,我们用原始字段对其进行掩码处理

使用 "require_field_match" : false 来高亮显示掩码字段

注意:span_field_masking 查询可能会出现意外的评分和突出显示行为。这是因为查询返回并突出显示了掩码字段,但评分和突出显示是使用原始字段的术语统计信息和偏移量完成的。

注意:为了使高亮显示正常工作,高亮器上的参数:require_field_match 应设置为 false

跨度优先查询

edit

匹配字段开头附近的跨度。以下是一个示例:

GET /_search
{
  "query": {
    "span_first": {
      "match": {
        "span_term": { "user.id": "kimchy" }
      },
      "end": 3
    }
  }
}

The match 子句可以是任何其他 span 类型查询。The end 控制 匹配中允许的最大结束位置。

跨多词查询

edit

The span_multi query 允许你将一个 multi term query(通配符、模糊、前缀、范围或正则表达式查询之一)包装为 span query,以便它可以嵌套。示例:

GET /_search
{
  "query": {
    "span_multi": {
      "match": {
        "prefix": { "user.id": { "value": "ki" } }
      }
    }
  }
}

提升也可以与查询相关联:

GET /_search
{
  "query": {
    "span_multi": {
      "match": {
        "prefix": { "user.id": { "value": "ki", "boost": 1.08 } }
      }
    }
  }
}

span_multi 查询如果在查询匹配的术语数量超过 indices.query.bool.max_clause_count 搜索设置 时,将会触发太多子句失败的错误。为了避免无限制的扩展,您可以将多术语查询的 重写方法 设置为 top_terms_* 重写。或者,如果您仅在 prefix 查询上使用 span_multi,您可以激活 text 字段的 index_prefixes 字段选项。这将把字段上的任何前缀查询重写为匹配索引前缀的单个术语查询。

跨度邻近查询

edit

匹配彼此接近的跨度。可以指定slop,即最大间隔未匹配位置的数量,以及是否要求匹配按顺序进行。以下是一个示例:

GET /_search
{
  "query": {
    "span_near": {
      "clauses": [
        { "span_term": { "field": "value1" } },
        { "span_term": { "field": "value2" } },
        { "span_term": { "field": "value3" } }
      ],
      "slop": 12,
      "in_order": false
    }
  }
}

元素 clauses 是一个包含一个或多个其他跨度类型查询的列表,而 slop 控制允许的最大间隔未匹配位置数量。

跨度非查询

edit

移除与另一个跨度查询重叠或位于另一个SpanQuery之前x个标记(由参数pre控制)或之后y个标记(由参数post控制)的匹配项。 以下是一个示例:

GET /_search
{
  "query": {
    "span_not": {
      "include": {
        "span_term": { "field1": "hoya" }
      },
      "exclude": {
        "span_near": {
          "clauses": [
            { "span_term": { "field1": "la" } },
            { "span_term": { "field1": "hoya" } }
          ],
          "slop": 0,
          "in_order": true
        }
      }
    }
  }
}

The includeexclude 子句可以是任何跨度类型查询。include 子句是匹配过滤的跨度查询,而 exclude 子句是匹配不能与返回结果重叠的跨度查询。

在上面的示例中,所有包含术语hoya的文档都被过滤掉了,除了那些前面有la的文档。

其他顶级选项:

pre

如果设置在包含跨度之前的令牌数量不能与排除跨度重叠。默认为0。

post

如果设置了在包含跨度之后的令牌数量不能与排除跨度重叠。默认为0。

dist

如果设置从包含范围中提取的令牌数量,则不能与排除范围重叠。相当于同时设置prepost

跨度或查询

edit

匹配其跨度子句的并集。以下是一个示例:

GET /_search
{
  "query": {
    "span_or" : {
      "clauses" : [
        { "span_term" : { "field" : "value1" } },
        { "span_term" : { "field" : "value2" } },
        { "span_term" : { "field" : "value3" } }
      ]
    }
  }
}

The clauses 元素是一个包含一个或多个其他 span 类型查询的列表。

跨度术语查询

edit

匹配包含某个词项的跨度。以下是一个示例:

GET /_search
{
  "query": {
    "span_term" : { "user.id" : "kimchy" }
  }
}

提升也可以与查询相关联:

GET /_search
{
  "query": {
    "span_term" : { "user.id" : { "value" : "kimchy", "boost" : 2.0 } }
  }
}

或者 :

GET /_search
{
  "query": {
    "span_term" : { "user.id" : { "term" : "kimchy", "boost" : 2.0 } }
  }
}

跨度内查询

edit

返回被另一个span查询包围的匹配项。 这里是一个示例:

GET /_search
{
  "query": {
    "span_within": {
      "little": {
        "span_term": { "field1": "foo" }
      },
      "big": {
        "span_near": {
          "clauses": [
            { "span_term": { "field1": "bar" } },
            { "span_term": { "field1": "baz" } }
          ],
          "slop": 5,
          "in_order": true
        }
      }
    }
  }
}

The biglittle 子句可以是任何跨度类型查询。匹配的 little 跨度被包含在 big 内时会被返回。