您需要一个正常运行的 Elasticsearch 安装,正如我们在 下载和安装 Elasticsearch 配方中所述第 1 章, 入门。
要执行这些命令,可以使用任何 HTTP 客户端,例如 curl (https://curl.haxx.se/)、postman (https://www.getpostman.com/),或类似的。我建议您使用 Kibana 控制台,因为它为 Elasticsearch 提供了代码完成和更好的字符转义。
要正确执行以下命令,您需要使用 ch04/populate_kibana.txt 命令填充的索引,该命令可在线获取代码。
要执行跨度查询,我们将执行以下步骤:
- The main element in span queries is span_term whose usage is similar to the term of the standard query. It is possible to aggregate more than one span_term to formulate a span query.
- The span_first query defines a query in which the span_term must match in the first token, or near it. The following code is an example of this:
- The span_or query is used to define multivalues in a span query. This is very handy for simple synonym search, as shown in the following example:
子句列表是 span_or 查询的核心,因为它包含应该匹配的跨度词。
- Similar to span_or, there is a span_multi query, which wraps multi-term queries such as prefix, wildcard, and so on. Consider the following code, for example:
- Queries can be used to create the span_near query, which allows you to control the token sequence of the query, as follows:
- For complex queries, skipping matching given positional tokens is very important. This can be achieved with the span_not query, as shown in the following example:
include 部分包含必须匹配的跨度; exclude 包含不能匹配的跨度。它匹配带有术语 nice 的文档,但不匹配 not nice。这对于排除否定短语非常有用!!!
- For searching with a span query that is surrounded by other terms, we can use the span_containing variable, as follows:
little 部分包含必须匹配的跨度。 big 部分包含包含 little 匹配项的跨度。在前面的例子中,匹配的表达式类似于 not * nice * guy。
- For searching with a span query that is enclosed by other span terms, we can use the span_within variable, as follows:
little 部分包含必须匹配的跨度。 big 部分包含包含 little 匹配项的跨度。
Lucene 提供了 Elasticsearch 中可用的跨度查询。基本跨度查询是与术语查询完全相同的 span_term。这个跨度查询的目标是匹配一个确切的术语(字段加文本)。它可以被组合来制定其他类型的跨度查询。
跨度查询的主要用途是邻近搜索:彼此接近的词。
在 span_first 中使用 span_term 表示匹配一个术语,该术语必须在第一位。如果定义了结束参数(整数),它将第一个标记匹配到传递的值。
最强大的跨度查询之一是 span_or,它允许在同一位置定义多个术语。它涵盖了多种场景,例如:
- Multinames
- Synonyms
- Several verbal forms
span_or 查询没有对应的 span_and,它应该没有意义,因为 span 查询是位置查询。
如果必须传递给 span_or 的术语数量很大,可以使用带有前缀或通配符的 span_multi 查询来减少它。例如,这种方法允许使用带有 play 的前缀查询匹配所有术语 play、playing、plays、player、players 等。
否则,最强大的跨度查询是span_near,它允许定义一个跨度查询列表(clauses)以按顺序匹配或不匹配。可以传递给这个跨度查询的参数是:
- in_order: This defines that the term matched in the clauses must be executed in order. If you define two span near queries with two span terms to match joe and black, and in_order is true, you will not be able to match black joe text (default true).
- slop: This defines the distance between terms that must be matched from the clauses (default 0).
If you set the values of
slop to
0 and
in_order to
true, you are creating an
exact phrase match query that we will see in the next recipe.
span_near 查询和 slop 可用于创建能够包含一些未知术语的短语匹配。例如,考虑匹配诸如 the house 之类的表达式。如果需要执行完全匹配,则需要编写类似的查询,如下例所示:
现在,例如,如果您在 the 文章和 house(即美妙的房子、大房子等)之间有一个形容词,那么以前的查询永远不会匹配它们。为了实现这个目标,需要将斜率设置为 1。
通常,slop 设置为 1、2 或 3 作为值:高值 (> 10) 没有意义。