指定分析器
Elasticsearch 提供了多种方式来指定内置或自定义分析器
- 按
text字段、索引或查询指定 - 用于 索引或搜索时
在不同级别和不同时间点指定分析器的灵活性很好……但仅在必要时使用。
在大多数情况下,简单的方法效果最好:为每个 text 字段指定一个分析器,如为字段指定分析器中所述。
这种方法与 Elasticsearch 的默认行为配合良好,让您可以在索引和搜索时使用相同的分析器。它还允许您使用 get mapping API 快速查看哪个分析器应用于哪个字段。
如果您通常不为索引创建映射,可以使用 索引模板 来达到类似的效果。
Elasticsearch 通过按顺序检查以下参数来确定要使用的索引分析器
- 该字段的
analyzer映射参数。请参阅为字段指定分析器。 analysis.analyzer.default索引设置。请参阅为索引指定默认分析器。
如果未指定这些参数中的任何一个,则使用 standard 分析器。
映射索引时,您可以使用 analyzer 映射参数为每个 text 字段指定分析器。
以下 创建索引 API 请求将 whitespace 分析器设置为 title 字段的分析器。
PUT my-index-000001
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace"
}
}
}
}
除了字段级分析器外,您还可以通过 analysis.analyzer.default 设置来设置回退分析器。
以下 创建索引 API 请求将 simple 分析器设置为 my-index-000001 的回退分析器。
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "simple"
}
}
}
}
}
在大多数情况下,指定不同的搜索分析器是不必要的。这样做可能会对相关性产生负面影响,并导致意外的搜索结果。
如果您选择指定单独的搜索分析器,我们建议您在生产环境中部署之前彻底测试您的分析配置。
在搜索时,Elasticsearch 通过按顺序检查以下参数来确定要使用的分析器
- 搜索查询中的
analyzer参数。请参阅为查询指定搜索分析器。 - 该字段的
search_analyzer映射参数。请参阅为字段指定搜索分析器。 analysis.analyzer.default_search索引设置。请参阅为索引指定默认搜索分析器。- 该字段的
analyzer映射参数。请参阅为字段指定分析器。
如果未指定这些参数中的任何一个,则使用 standard 分析器。
编写全文查询时,您可以使用 analyzer 参数来指定搜索分析器。如果提供,它将覆盖任何其他搜索分析器。
以下 搜索 API 请求将 stop 分析器设置为 match 查询的搜索分析器。
GET my-index-000001/_search
{
"query": {
"match": {
"message": {
"query": "Quick foxes",
"analyzer": "stop"
}
}
}
}
映射索引时,您可以使用 search_analyzer 映射参数为每个 text 字段指定搜索分析器。
如果提供了搜索分析器,则必须同时使用 analyzer 参数指定索引分析器。
以下 创建索引 API 请求将 simple 分析器设置为 title 字段的搜索分析器。
PUT my-index-000001
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace",
"search_analyzer": "simple"
}
}
}
}
在创建索引时,您可以使用 analysis.analyzer.default_search 设置来设置默认搜索分析器。
如果提供了搜索分析器,则必须同时使用 analysis.analyzer.default 设置指定默认索引分析器。
以下 创建索引 API 请求将 whitespace 分析器设置为 my-index-000001 索引的默认搜索分析器。
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "simple"
},
"default_search": {
"type": "whitespace"
}
}
}
}
}
您只能在已关闭的索引上定义新分析器。要添加分析器,必须关闭索引,定义分析器,然后重新打开索引。
例如,以下命令将 content 分析器添加到 my-index-000001 索引中
POST /my-index-000001/_close
PUT /my-index-000001/_settings
{
"analysis" : {
"analyzer":{
"content":{
"type":"custom",
"tokenizer":"whitespace"
}
}
}
}
POST /my-index-000001/_open
您无法关闭数据流的写入索引。要更新数据流的写入索引和未来后备索引的分析器,请更新该流所使用的索引模板中的分析器。然后滚动更新数据流(roll over),将新分析器应用于流的写入索引和未来的后备索引。这会影响滚动更新后添加到流中的搜索和任何新数据。但是,它不会影响数据流的现有后备索引或其现有数据。
要更改现有后备索引的分析器,您必须创建一个新的数据流并将数据重新索引(reindex)到其中。请参阅使用 reindex 更改映射或设置。