Intervals 查询

Intervals 查询 #

间隔查询根据匹配词的邻近度和顺序来匹配文档。它将一组匹配规则应用于指定字段中的词。该查询生成跨越文本中词的最小间隔序列。你可以组合间隔并按父源进行过滤。

考虑一个包含以下文档的索引:

PUT testindex/_doc/1
{
  "title": "key-value pairs are efficiently stored in a hash table"
}

PUT /testindex/_doc/2
{
  "title": "store key-value pairs in a hash map"
}

例如,以下查询搜索包含短语 key-value pairs (词之间没有间隔)后跟 hash tablehash map 的文档:

GET /testindex/_search
{
  "query": {
    "intervals": {
      "title": {
        "all_of": {
          "ordered": true,
          "intervals": [
            {
              "match": {
                "query": "key-value pairs",
                "max_gaps": 0,
                "ordered": true
              }
            },
            {
              "any_of": {
                "intervals": [
                  {
                    "match": {
                      "query": "hash table"
                    }
                  },
                  {
                    "match": {
                      "query": "hash map"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

该查询返回两个文档:

{
  "took": 1011,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 0.25,
    "hits": [
      {
        "_index": "testindex",
        "_id": "2",
        "_score": 0.25,
        "_source": {
          "title": "store key-value pairs in a hash map"
        }
      },
      {
        "_index": "testindex",
        "_id": "1",
        "_score": 0.14285713,
        "_source": {
          "title": "key-value pairs are efficiently stored in a hash table"
        }
      }
    ]
  }
}

参数说明 #

该查询将字段名称( <field> )作为顶级参数接受:

GET _search
{
  "query": {
    "intervals": {
      "<field>": {
        ...
      }
    }
  }
}

<field> 接受以下规则对象,这些规则对象用于根据词项、顺序和邻近度来匹配文档。

规则描述
match匹配分析文本。
prefix匹配以指定字符集开头的词项。
wildcard使用通配符模式匹配词项。
fuzzy在指定的编辑距离内匹配与提供词项相似的词项。
all_of使用合取( AND )组合多个规则。
any_of使用析取( OR )组合多个规则。

match 规则 #

match 规则匹配分析后的文本。下表列出了 match 规则支持的所有参数。

参数必需/可选数据类型描述
query必需String要搜索的文本。
analyzer可选String用于分析 query 文本的解析器。默认为为 指定的解析器。
filter可选间隔过滤器规则对象用于过滤返回间隔的规则。
max_gaps可选Integer匹配词项之间允许的最大位置数。距离超过 max_gaps 的词项不被视为匹配。如果 max_gaps 未指定或设置为 -1 ,无论位置如何,词项都被视为匹配。如果 max_gaps 设置为 0 ,匹配的词项必须相邻出现。默认为 -1 。
ordered可选Boolean指定匹配的词项是否必须按指定顺序出现。默认值为 false 。
use_field可选String指定在此字段中搜索,而不是在顶层字段中搜索。词项使用为此字段指定的搜索分词器进行分析。通过指定 use_field,您可以像它们是同一个字段一样跨多个字段进行搜索。例如,如果您将相同的文本索引到词干化和未词干化的字段中,您可以搜索与未词干化词项相邻的词干化词项。

prefix 规则 #

prefix 规则匹配以指定字符集(前缀)开头的词项。前缀可以扩展以匹配最多 128 个词项。如果前缀匹配的词项超过 128 个,则返回错误。下表列出了 prefix 规则支持的所有参数。

参数必需/可选数据类型描述
prefix必需String用于匹配词的前缀。
analyzer可选String用于分析 prefix 文本的解析器。默认为为 指定的解析器。
use_field可选String指定搜索此字段而不是顶层字段。prefix使用此字段指定的搜索分词器进行规范化,除非您指定了analyzer

wildcard 规则 #

wildcard 规则使用通配符模式匹配词项。通配符模式最多可以扩展匹配 128 个词项。如果模式匹配的词项超过 128 个,将返回错误。下表列出了 wildcard 规则支持的所有参数。

参数必需/可选数据类型描述
pattern必需String用于匹配词项的通配符模式。指定 ? 匹配任意单个字符,或指定 * 匹配零个或多个字符。
analyzer可选String用于分析 pattern 文本的解析器。默认为为 指定的解析器。
use_field可选String指定搜索此字段而不是顶层字段。pattern使用此字段指定的搜索分词器进行规范化,除非您指定了analyzer

指定以 * 或 ? 开头的模式可能会降低搜索性能,因为它增加了匹配词项所需的迭代次数。

fuzzy 规则 #

fuzzy 规则匹配与提供的词项在指定编辑距离内相似的词项。模糊模式最多可以扩展以匹配 128 个词项。如果模式匹配的词项超过 128 个,则会返回错误。下表列出了 fuzzy 规则支持的所有参数。

参数必需/可选数据类型描述
term必需String要匹配的词项。
analyzer可选String用于分析 term 文本的解析器。默认为为 指定的解析器。
fuzziness可选String在确定词项是否与值匹配时,将一个词转换为另一个词所需的字符编辑次数(插入、删除、替换)。例如, wined 和 wind 之间的距离是 1。有效值是非负整数或 AUTO 。默认值 AUTO 根据每个词的长度选择值,对于大多数用例是一个不错的选择。
transpositions可选Boolean将 transpositions 设置为 true (默认值)会将相邻字符的交换添加到 fuzziness 选项的插入、删除和替换操作中。例如,如果 transpositions 为真(交换“n”和“i”),则 wind 和 wnid 之间的距离是 1;如果为假(删除“n”,插入“n”),则距离是 2。如果 transpositions 是 false ,则 rewind 和 wnid 与 wind 的距离相同(2),尽管从更以人为中心的观点来看, wnid 是一个明显的拼写错误。对于大多数用例,默认值是一个不错的选择。
prefix_length可选Integer模糊匹配时保持不变的开头字符数。默认为 0。
use_field可选String指定搜索此字段而不是顶层字段。term使用此字段指定的搜索分词器进行规范化,除非您指定了analyzer

all_of 规则 #

all_of 规则使用合取( AND )组合多个规则。下表列出了 all_of 规则支持的所有参数。

参数必需/可选数据类型描述
intervals必需规则对象数组一组用于组合的规则。文档必须匹配所有规则才能在结果中返回。
filter可选间隔过滤器规则对象用于过滤返回间隔的规则。
max_gaps可选Integer匹配词项之间允许的最大位置数。距离超过 max_gaps 的词项不被视为匹配。如果 max_gaps 未指定或设置为 -1 ,无论位置如何,词项都被视为匹配。如果 max_gaps 设置为 0 ,匹配的词项必须相邻出现。默认为 -1 。
ordered可选Boolean如果 true ,则根据规则生成的间隔应按指定顺序出现。默认为 false 。

any_of 规则 #

any_of 规则使用合取( OR )组合多个规则。下表列出了 any_of 规则支持的所有参数。

参数必需/可选数据类型描述
intervals必需规则对象数组一组用于组合的规则。文档必须匹配所有规则才能在结果中返回。
filter可选间隔过滤器规则对象用于过滤返回间隔的规则。

filter 规则 #

filter 规则用于限制结果。下表列出了 filter 规则支持的所有参数。

参数必需/可选数据类型描述
after可选查询对象用于返回符合筛选规则中指定间隔的间隔的查询。
before可选查询对象一个用于返回在筛选规则中指定的时间段之前的区间的查询。
contained_by可选查询对象一个用于返回在筛选规则中指定的时间段所包含的区间的查询。
containing可选查询对象一个用于返回包含在筛选规则中指定间隔的间隔的查询。
not_contained_by可选查询对象一个用于返回不包含在筛选规则中指定间隔的间隔的查询。
not_containing可选查询对象一个用于返回不包含在筛选规则中指定的时间段的查询。
not_overlapping可选查询对象一个用于返回与筛选规则中指定的时间段不重叠的查询。
overlapping可选查询对象用于返回与过滤器规则中指定的区间重叠的区间的查询。
script可选查询对象用于匹配文档的脚本。此脚本必须返回 true 或 false 。

示例:过滤器 #

以下查询搜索包含 pairshash 的文档,这两个词彼此相距不超过五个位置,并且它们之间不包含 efficiently 这个词:

POST /testindex/_search
{
  "query": {
    "intervals" : {
      "title" : {
        "match" : {
          "query" : "pairs hash",
          "max_gaps" : 5,
          "filter" : {
            "not_containing" : {
              "match" : {
                "query" : "efficiently"
              }
            }
          }
        }
      }
    }
  }
}

返回内容中只包含文档 2:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.25,
    "hits": [
      {
        "_index": "testindex",
        "_id": "2",
        "_score": 0.25,
        "_source": {
          "title": "store key-value pairs in a hash map"
        }
      }
    ]
  }
}

示例:脚本过滤器 #

或者,您可以使用以下变量编写自己的脚本过滤器,并将其与 intervals 查询一起使用:

  • interval.start : 间隔开始的位置(词编号)。
  • interval.end : 间隔结束的位置(词编号)。
  • interval.gap : 两个词之间的词数。

例如,以下查询在指定间隔内搜索相邻的 maphash 这两个词。词的编号从 0 开始,所以在文本 store key-value pairs in a hash map 中, store 位于位置 0, key 位于位置 1 ,以此类推。指定的间隔应从 a 之后开始,并在字符串末尾之前结束:

POST /testindex/_search
{
  "query": {
    "intervals" : {
      "title" : {
        "match" : {
          "query" : "map hash",
          "filter" : {
            "script" : {
              "source" : "interval.start > 5 && interval.end < 8 && interval.gaps == 0"
            }
          }
        }
      }
    }
  }
}

返回内容包含文档 2:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.5,
    "hits": [
      {
        "_index": "testindex",
        "_id": "2",
        "_score": 0.5,
        "_source": {
          "title": "store key-value pairs in a hash map"
        }
      }
    ]
  }
}

间隔最小化 #

为确保查询在线性时间内运行, intervals 查询会最小化间隔。例如,考虑一个包含文本a b c d c的文档。您可以使用以下查询来搜索被 ac 包含的 d

POST /testindex/_search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "match" : {
          "query" : "d",
          "filter" : {
            "contained_by" : {
              "match" : {
                "query" : "a c"
              }
            }
          }
        }
      }
    }
  }
}

该查询没有返回结果,因为它匹配了前两个词 a c ,并且在这两个词之间没有找到 d