# /

# Search your data(搜索)

搜索查询或查询是对Elasticsearch数据流或索引中的数据信息的请求。
您可以将查询视为一个问题,以Elasticsearch理解的方式编写。根据您的数据,您可以使用查询来获得以下问题的答案:

  • 我的服务器上哪些进程的响应时间超过500毫秒?
  • 上周我的网络上有哪些用户运行了regsvr32.exe?
  • 我的网站上的哪些页面包含特定的单词或短语?

搜索由一个或多个查询组成,这些查询被组合并发送到Elasticsearch。与搜索查询匹配的文档将在响应的命中数或搜索结果中返回。
搜索还可以包含用于更好地处理其查询的附加信息。例如,搜索可能仅限于特定索引,或者只返回特定数量的结果。

Search your data 搜索您的数据
Collapse search results 折叠搜索结果
Filter search results 筛选搜索结果
Highlighting 突出显示
Long-running searches 长期搜索
Near real-time search 近实时搜索
Paginate search results 分页搜索结果
Retrieve inner hits 检索内部命中
Retrieve selected fields 检索所选字段
Search across clusters 跨集群搜索
Search multiple data streams and indices 搜索多个数据流和索引
Search shard routing 搜索碎片路由
Sort search results 对搜索结果排序
1
2
3
4
5
6
7
8
9
10
11
12
13

# 分页搜索结果(Paginate search results)

# 避免深度分页或过多结果

默认情况下,搜索会返回前10个匹配的命中数。要浏览更大的结果集,可以使用搜索API的from和size参数。from参数定义要跳过的命中数,默认为0。size参数是要返回的最大命中数。这两个参数一起定义了一页结果。

GET /_search
{
  "from": 5,
  "size": 20,
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}
1
2
3
4
5
6
7
8
9
10

避免使用from和size过深地翻页或一次请求过多结果。搜索请求通常跨越多个碎片shards。每个碎片shard都必须将其请求的命中率和任何先前页面的命中率加载到内存中。对于深度页面或大型结果集,这些操作可能会显著增加内存和CPU使用率,从而导致性能下降或节点故障。
默认情况下,您不能使用from和size来浏览超过10000次点击。此限制是由index.max_result_window索引设置设置的保护措施。如果您需要浏览超过10000次点击,请改用search_after参数。
注意:Elasticsearch使用Lucene的内部文档ID作为决胜局tie-breakers。这些内部文档ID在相同数据的副本之间可能完全不同。当分页搜索命中时,您可能偶尔会看到具有相同排序值的文档排序不一致。

# Search after(在上页之后搜索)

您可以使用search_after参数,使用上一页中的一组排序值sort values来检索下一页的点击量。
使用search_after需要多个具有相同查询和排序值的搜索请求。如果在这些请求之间发生刷新,结果的顺序可能会发生变化,从而导致页面之间的结果不一致。为了防止这种情况,您可以创建一个时间点(PIT)来在搜索中保留当前索引状态。

#获取视图id
POST /my-index-000001/_pit?keep_alive=1m

#视图id
{
  "id": "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA=="
}

#分页排序
GET /_search
{
  "size": 10000,
  "query": {
    "match" : {
      "user.id" : "elkbee"
    }
  },
  "pit": {
	    "id":  "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA==", 
	    "keep_alive": "1m"
  },
  "sort": [ //双排序字段
    {"@timestamp": "asc"},
    {"_shard_doc": "desc"}
  ]
}

#search_after
GET /_search
{
  "size": 10000,
  "query": {
    "match" : {
      "user.id" : "elkbee"
    }
  },
  "pit": {
	    "id":  "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA==", 
	    "keep_alive": "1m"
  },
  "sort": [
    {"@timestamp": "asc"},
    {"_shard_doc": "desc"}
  ],
  "search_after": [ //Sort values来自上一次搜索的最后一次点击。
    4098435132000,
    4294967298
  ],
  "track_total_hits": false //禁用对total hits的跟踪以加快分页。
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# Point in time API(轻量级视图)

默认情况下,搜索请求针对目标索引的最新可见数据执行,该数据称为时间点。Elasticsearch pit(时间点)是一个轻量级的视图,可以查看数据在启动时的状态。在某些情况下,最好使用同一时间点执行多个搜索请求。例如,如果刷新发生在search_after请求之间,则这些请求的结果可能不一致,因为搜索之间发生的更改仅对最近的时间点可见。
先决条件

  • 如果启用了Elasticsearch安全功能,则您必须具有目标数据流、索引或索引别名的读取索引权限。
  • 要在时间点(PIT)中搜索索引别名,您必须具有该别名的具体索引的读取索引权限。
#在搜索请求中使用时间点之前,必须显式打开时间点。
#keep_alive参数告诉Elasticsearch它应该让一个时间点存活多长时间,例如?keep_alive=5m。
POST /my-index-000001/_pit?keep_alive=1m


#上述请求的结果包括一个id,该id应传递给搜索请求的pit参数的id。
POST /_search 
{
    "size": 100,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "pit": {
	    "id":  "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA==", 
	    "keep_alive": "1m"  
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Scroll search results(滚动搜索结果)

注意:我们不再建议使用scroll API进行深度分页。如果在分页超过10000次点击时需要保留索引状态,请使用带有时间点(PIT)的search_after参数。

# 排序搜索结果(Sort search results)

允许您在特定字段上添加一个或多个排序。每种排序也可以反过来。排序是在每个字段级别上定义的,使用特殊的字段名称_score按分数排序,使用_doc按索引顺序排序。

#假设以下索引映射:
PUT /my-index-000001
{
  "mappings": {
    "properties": {
      "post_date": { "type": "date" },
      "user": {
        "type": "keyword"
      },
      "name": {
        "type": "keyword"
      },
      "age": { "type": "integer" }
    }
  }
}

#多字段排序
GET /my-index-000001/_search
{
  "sort" : [
    { "post_date" : {"order" : "asc"}},
    "user", //默认为asc
    { "name" : "desc" },
    { "age" : "desc" },
    "_score" //默认为desc
  ],
  "query" : {
    "term" : { "user" : "kimchy" }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

注意:_doc除了是最有效的排序顺序之外,没有任何实际的用例。因此,如果您不关心返回文档的顺序,那么您应该按_doc进行排序。这在滚动时尤其有用。

# 排序顺序(Sort Order)

在对_score排序时,顺序默认为desc,在对其他任何内容排序时,顺序默认为asc。

# 跟踪分数(Track Scores)

在字段上排序时,不会计算分数。通过将track_scores设置为true,分数仍将被计算和跟踪。

GET /_search
{
  "track_scores": true,
  "sort" : [
    { "post_date" : {"order" : "desc"} },
    { "name" : "desc" },
    { "age" : "desc" }
  ],
  "query" : {
    "term" : { "user" : "kimchy" }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
# 内存注意事项(Memory Considerations)

排序时,相关的已排序字段值将加载到内存中。这意味着每个碎片都应该有足够的内存来容纳它们。对于基于字符串的类型,不应分析/标记排序的字段。对于数字类型,如果可能,建议将类型显式设置为较窄的类型(如short、integer和float)。

# 高亮显示(Highlighting)

高亮显示使您能够从搜索结果中的一个或多个字段中获取高亮显示的片段,以便向用户显示查询匹配的位置。当您请求高亮显示时,响应会为每个搜索命中包含一个额外的高亮显示元素,其中包括高亮显示的字段和高亮显示的片段。
注意:高亮显示在提取要高亮显示的术语时不会反映查询的布尔逻辑。因此,对于一些复杂的布尔查询(例如嵌套布尔查询、使用minimum_should_match的查询等),文档中与查询匹配不对应的部分可能会被突出显示。
高亮显示需要字段的实际内容。如果未存储字段(映射未将store设置为true),则加载实际的_source,并从_source中提取相关字段。
例如,要使用默认荧光笔获取每个搜索命中中内容字段的高亮显示,请在指定内容字段的请求正文中包含一个高亮显示对象:

GET example/_search
{
  "query": {
    "match": {
      "comment": "英文"
    }
  },
  "highlight": {
    "fields": {
      "comment": {}
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

Elasticsearch支持三种荧光笔:统一荧光笔、普通荧光笔和fvh(快速矢量荧光笔)。您可以指定要用于每个字段的荧光笔类型。

# 统一荧光笔(Unified highlighter)

统一荧光笔使用Lucene统一荧光笔。这种荧光笔将文本分解为句子,并使用BM25算法对单个句子进行评分,就好像它们是语料库中的文档一样。它还支持精确的短语和多术语(模糊、前缀、正则表达式)突出显示。这是默认的荧光笔。

DELETE example
PUT /example
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "english"
      },
      "comment" : {
        "type": "text",
        "term_vector" : "with_positions_offsets"//否则不支持fvh
      }
    }
  }
}

POST example/_create/1
{
  "content": "中文内容",
  "comment": "中文注释"
}
POST example/_create/2
{
  "content": "英文内容",
  "comment": "英文注释"
}

GET example/_search
{
  "query": {
    "match": {
      "comment": "英文"
    }
  },
  "highlight": {
    "fields": {
      "comment": {}
    }
  }
}

#返回结果
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.8754687,
    "hits" : [
      {
        "_index" : "example",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.8754687,
        "_source" : {
          "content" : "英文内容",
          "comment" : "英文注释"
        },
        "highlight" : {
          "comment" : [
            "<em>英</em><em>文</em>注释"
          ]
        }
      },
      {
        "_index" : "example",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.18232156,
        "_source" : {
          "content" : "中文内容",
          "comment" : "中文注释"
        },
        "highlight" : {
          "comment" : [
            "中<em>文</em>注释"
          ]
        }
      }
    ]
  }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 普通荧光笔(Plain highlighter)

普通荧光笔使用标准Lucene荧光笔。它试图从理解单词重要性和短语查询中的任何单词定位标准的角度来反映查询匹配逻辑。
注意:普通荧光笔最适合在单个字段中突出显示简单的查询匹配。为了准确反映查询逻辑,它在内存中创建了一个微小的索引,并通过Lucene的查询执行计划器重新运行原始查询条件,以访问当前文档的低级别匹配信息。对于需要突出显示的每个字段和每个文档,都会重复此操作。如果您想突出显示具有复杂查询的许多文档中的许多字段,我们建议在postings或term_vector字段上使用unified的高亮显示。

GET example/_search
{
  "query": {
    "match": {
      "comment": "英文"
    }
  },
  "highlight": {
    "fields": {
      "comment": {
        "type": "plain"
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# FVH荧光笔(Fast vector highlighter)

fvh荧光笔使用Lucene Fast Vector荧光笔。此荧光笔可用于映射中term_vector设置为with_positions_offset的字段。快速矢量荧光笔:

  • 可以使用boundary_scanner进行自定义。
  • 需要将term_vector设置为带有_positions_offsets,这会增加索引的大小
  • 可以将多个字段中的匹配项组合为一个结果。请参阅matched_fields
  • 可以为不同位置的匹配分配不同的权重,允许在突出显示将短语匹配提升到术语匹配之上的Boosting Query时,将短语匹配排序在术语匹配之上

注意:fvh荧光笔不支持span查询。如果您需要对span查询的支持,请尝试其他荧光笔,例如统一荧光笔。

GET example/_search
{
  "query": {
    "match": {
      "comment": "英文"
    }
  },
  "highlight": {
    "fields": {
      "comment": {
        "type": "fvh"
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 控制高亮片段(Control highlighted fragments)

每个高亮显示的字段都可以控制高亮显示的片段的大小(默认为100),以及返回的最大片段数(默认为5)。例如:

GET /_search
{
  "query" : {
    "match": { "user.id": "kimchy" }
  },
  "highlight" : {
    "fields" : {
      "comment" : {"fragment_size" : 150, "number_of_fragments" : 3}
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11

除此之外,还可以指定高亮显示的片段需要按分数排序:

GET /_search
{
  "query" : {
    "match": { "user.id": "kimchy" }
  },
  "highlight" : {
    "order" : "score",
    "fields" : {
      "comment" : {"fragment_size" : 150, "number_of_fragments" : 3}
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12

如果number_of_frances值设置为0,则不会生成任何片段,而是返回字段的全部内容,当然还会突出显示。如果需要突出显示短文本(如文档标题或地址),但不需要分段,这将非常方便。请注意,在这种情况下会忽略fragment_size。

GET /_search
{
  "query" : {
    "match": { "user.id": "kimchy" }
  },
  "highlight" : {
    "fields" : {
      "body" : {},
      "blog.title" : {"number_of_fragments" : 0}
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12

使用fvh时,可以使用fragment_offset参数来控制开始高亮显示的边距。
在没有要突出显示的匹配片段的情况下,默认情况是不返回任何内容。相反,我们可以通过将no_match_size(默认值为0)设置为要返回的文本长度,从字段开头返回一段文本。实际长度可能比指定的短或长,因为它试图打破单词边界。

GET /_search
{
  "query": {
    "match": { "user.id": "kimchy" }
  },
  "highlight": {
    "fields": {
      "comment": {
        "fragment_size": 150,
        "number_of_fragments": 3,
        "no_match_size": 150
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 荧光笔内部工作原理(How highlighters work internally)

给定一个查询和一个文本(文档字段的内容),高亮显示的目标是找到查询的最佳文本片段,并突出显示找到的片段中的查询术语。为此,荧光笔需要解决以下几个问题:

  • 如何将文本分解成碎片?
  • 如何在所有碎片中找到最好的碎片?
  • 如何在片段中突出显示查询词?
# 如何将文本分解成碎片?

相关设置:fragment_size、fragmenter、荧光笔类型、boundary_chars、boundary_max_scan、boundary_scanner、boundary_scanner_locate。
普通荧光笔首先使用给定的分析器分析文本,并从中创建令牌流。普通荧光笔使用一个非常简单的算法将令牌流分解为片段。它循环遍历令牌流中的术语,每当当前术语的end_offset超过fragment_size乘以创建的片段数时,就会创建一个新的片段。使用span fragmenter可以进行更多的计算,以避免在高亮显示的术语之间分解文本。但总的来说,由于中断只能通过fragment_size来完成,因此有些片段可能很奇怪,例如以标点符号开头。
Unified或FVH荧光笔可以更好地利用Java的BreakIterator将文本分解为片段。这确保了只要fragment_size允许,片段就是一个有效的句子。
注意:

  • 普通荧光笔使用一个非常简单的算法将令牌流分解为片段。
  • Unified或FVH荧光笔可以更好地利用Java的BreakIterator将文本分解为片段。
# 如何找到最好的碎片?

相关设置:number_of_frances。
为了找到最好、最相关的片段,荧光笔需要根据给定的查询对每个片段进行评分。目标是只对那些参与生成文档命中率的术语进行评分。对于一些复杂的查询,这项工作仍在进行中。
普通的highlighter从当前的令牌流创建一个内存中的索引,并通过Lucene的查询执行计划器重新运行原始查询条件,以访问当前文本的低级别匹配信息。对于更复杂的查询,可以将原始查询转换为跨度查询,因为跨度查询可以更准确地处理短语。然后,使用该获得的低级别匹配信息来对每个单独片段进行评分。普通荧光笔的评分方法很简单。每个片段都根据在该片段中找到的唯一查询项的数量进行评分。单个术语的分数等于其提升,默认为1。因此,默认情况下,包含一个唯一查询项的片段将获得1分;而一个包含两个唯一查询项的片段将获得2分,依此类推。然后根据分数对片段进行排序,因此将首先输出得分最高的片段。
FVH不需要分析文本并构建内存索引,因为它使用预先索引的文档术语向量,并在其中找到与查询相对应的术语。FVH根据在该片段中找到的查询词的数量对每个片段进行评分。和普通荧光笔类似,单个项的得分等于其提升值。与普通的高亮显示不同,所有查询术语都会被计算在内,而不仅仅是唯一的术语。
统一荧光笔可以使用预索引项向量或预索引项偏移量(如果可用)。否则,与普通Highlighter类似,它必须从文本中创建内存索引。统一荧光笔使用BM25评分模型对碎片进行评分。
注意:

  • 默认情况下,包含一个唯一查询项的片段将获得1分;而一个包含两个唯一查询项的片段将获得2分,依此类推。然后根据分数对片段进行排序,因此将首先输出得分最高的片段。
  • 普通的highlighter从当前的令牌流创建一个内存中的索引,并通过Lucene的查询执行计划器重新运行原始查询条件,以访问当前文本的低级别匹配信息。
  • FVH不需要分析文本并构建内存索引,因为它使用预先索引的文档术语向量,并在其中找到与查询相对应的术语。
  • 统一荧光笔可以使用预索引项向量或预索引项偏移量(如果可用)。
# 如何在片段中突出显示查询词?

相关设置:前置标签、后置标签。
目标是只强调那些参与生成文档命中率的术语。对于一些复杂的布尔查询,这项工作仍在进行中,因为高亮显示不反映查询的布尔逻辑,只提取叶(术语、短语、前缀等)查询。
在给定令牌流和原始文本的情况下,普通高亮显示会重新组合原始文本,以仅突出显示令牌流中包含在前一步骤的低级别匹配信息结构中的术语。
FVH和统一荧光笔使用中间数据结构以某种原始形式表示片段,然后用实际文本填充它们。
荧光笔使用前标签和后标签对高亮显示的术语进行编码。
注意:

  • 普通高亮显示会重新组合原始文本,以仅突出显示令牌流中包含在前一步骤的低级别匹配信息结构中的术语。
  • FVH和统一荧光笔使用中间数据结构以某种原始形式表示片段,然后用实际文本填充它们。
# Term vectors API
REST APIs
API conventions
Autoscaling APIs
Compact and aligned text (CAT) APIs
Cluster APIs
Cross-cluster replication APIs
Data stream APIs
Document APIs
Enrich APIs
Features APIs
Find structure API
Graph explore API
Index APIs
Index lifecycle management APIs
Ingest APIs
Info API
Licensing APIs
Logstash APIs
Machine learning anomaly detection APIs
Machine learning data frame analytics APIs
Migration APIs
Reload search analyzers API
Repositories metering APIs
Rollup APIs
Script APIs
Search APIs
Searchable snapshots APIs
Security APIs
Snapshot and restore APIs
Snapshot lifecycle management APIs
Transform APIs
Usage API
Watcher APIs
Definitions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Document APIs
Reading and Writing documents
Index
Get
Delete
Delete by query
Update
Update by query
Multi get
Bulk
Reindex
Term vectors
Multi term vectors
?refresh
Optimistic concurrency control
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

首先,我们创建一个索引,用于存储术语向量、有效载荷等:

PUT /my-index-000001
{ "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "term_vector": "with_positions_offsets_payloads",
        "store" : true,
        "analyzer" : "fulltext_analyzer"
       },
       "fullname": {
        "type": "text",
        "term_vector": "with_positions_offsets_payloads",
        "analyzer" : "fulltext_analyzer"
      }
    }
  },
  "settings" : {
    "index" : {
      "number_of_shards" : 1,
      "number_of_replicas" : 0
    },
    "analysis": {
      "analyzer": {
        "fulltext_analyzer": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "type_as_payload"
          ]
        }
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

其次,我们添加一些文档:

PUT /my-index-000001/_doc/1
{
  "fullname" : "John Doe",
  "text" : "test test test "
}

PUT /my-index-000001/_doc/2?refresh=wait_for
{
  "fullname" : "Jane Doe",
  "text" : "Another test ..."
}
1
2
3
4
5
6
7
8
9
10
11

以下请求返回文档1(John Doe)中字段文本的所有信息和统计信息:

GET /my-index-000001/_termvectors/1
{
  "fields" : ["text"],
  "offsets" : true,
  "payloads" : true,
  "positions" : true,
  "term_statistics" : true,
  "field_statistics" : true
}
1
2
3
4
5
6
7
8
9

响应:

{
  "_index": "my-index-000001",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "found": true,
  "took": 6,
  "term_vectors": {
    "text": {
      "field_statistics": {
        "sum_doc_freq": 4,
        "doc_count": 2,
        "sum_ttf": 6
      },
      "terms": {
        "test": {
          "doc_freq": 2,
          "ttf": 4,
          "term_freq": 3,
          "tokens": [
            {
              "position": 0,
              "start_offset": 0,
              "end_offset": 4,
              "payload": "d29yZA=="
            },
            {
              "position": 1,
              "start_offset": 5,
              "end_offset": 9,
              "payload": "d29yZA=="
            },
            {
              "position": 2,
              "start_offset": 10,
              "end_offset": 14,
              "payload": "d29yZA=="
            }
          ]
        }
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# term_vector
Mapping
Dynamic mapping
Explicit mapping
Runtime fields
Field data types
Metadata fields
Mapping parameters
Mapping limit settings
Removal of mapping types
1
2
3
4
5
6
7
8
9
Mapping parameters
analyzer
boost
coerce
copy_to
doc_values
dynamic
eager_global_ordinals
enabled
format
ignore_above
ignore_malformed
index
index_options
index_phrases
index_prefixes
meta
fields
normalizer
norms
null_value
position_increment_gap
properties
search_analyzer
similarity
store
term_vector
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

术语向量包含有关分析过程产生的术语的信息,包括:

  • 术语列表。
  • 每个术语的位置(或顺序)。
  • 将术语映射到原始字符串中其原点的起始字符偏移和结束字符偏移。
  • 有效载荷(如果可用)——与每个术语位置相关联的用户定义的二进制数据。

term_vector可选项:

no                             |No term vectors are stored. (default)
yes                            |Just the terms in the field are stored.
with_positions                 |Terms and positions are stored.
with_offsets                   |Terms and character offsets are stored.
with_positions_offsets         |Terms, positions, and character offsets are stored.
with_positions_payloads        |Terms, positions, and payloads are stored.
with_positions_offsets_payloads|Terms, positions, offsets and payloads are stored.
1
2
3
4
5
6
7

注意:设置with_positions_offsets 将使字段索引的大小加倍。

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "text": {
        "type":        "text",
        "term_vector": "with_positions_offsets"
      }
    }
  }
}

PUT my-index-000001/_doc/1
{
  "text": "Quick brown fox"
}

GET my-index-000001/_search
{
  "query": {
    "match": {
      "text": "brown fox"
    }
  },
  "highlight": {
    "fields": {
      "text": {} 
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30