指定分析器

编辑

Elasticsearch 提供了多种方式来指定内置或自定义分析器

保持简单

在不同级别和不同时间指定分析器的灵活性很棒……但仅在需要时才使用

在大多数情况下,简单的方法效果最好:为每个 text 字段指定一个分析器,如 为字段指定分析器 中所述。

这种方法与 Elasticsearch 的默认行为配合良好,允许您在索引和搜索时使用相同的分析器。它还允许您使用 获取映射 API 快速查看哪个分析器应用于哪个字段。

如果您通常不为索引创建映射,可以使用索引模板来实现类似的效果。

Elasticsearch 如何确定索引分析器

编辑

Elasticsearch 通过按顺序检查以下参数来确定要使用的索引分析器

  1. 该字段的 analyzer 映射参数。请参阅为字段指定分析器
  2. analysis.analyzer.default 索引设置。请参阅为索引指定默认分析器

如果未指定这些参数,则使用 standard 分析器

为字段指定分析器

编辑

在映射索引时,可以使用 analyzer 映射参数来为每个 text 字段指定一个分析器。

以下 创建索引 API 请求将 whitespace 分析器设置为 title 字段的分析器。

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "title": {
                "type": "text",
                "analyzer": "whitespace"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        title: {
          type: 'text',
          analyzer: 'whitespace'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      title: {
        type: "text",
        analyzer: "whitespace",
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "whitespace"
      }
    }
  }
}

为索引指定默认分析器

编辑

除了字段级分析器外,您还可以使用 analysis.analyzer.default 设置来设置回退分析器。

以下 创建索引 API 请求将 simple 分析器设置为 my-index-000001 的回退分析器。

resp = client.indices.create(
    index="my-index-000001",
    settings={
        "analysis": {
            "analyzer": {
                "default": {
                    "type": "simple"
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          default: {
            type: 'simple'
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    analysis: {
      analyzer: {
        default: {
          type: "simple",
        },
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "simple"
        }
      }
    }
  }
}

Elasticsearch 如何确定搜索分析器

编辑

在大多数情况下,指定不同的搜索分析器是不必要的。这样做可能会对相关性产生负面影响,并导致意外的搜索结果。

如果您选择指定单独的搜索分析器,我们建议您在部署到生产环境之前彻底测试您的分析配置

在搜索时,Elasticsearch 通过按顺序检查以下参数来确定要使用的分析器

  1. 搜索查询中的 analyzer 参数。请参阅为查询指定搜索分析器
  2. 该字段的 search_analyzer 映射参数。请参阅为字段指定搜索分析器
  3. analysis.analyzer.default_search 索引设置。请参阅为索引指定默认搜索分析器
  4. 该字段的 analyzer 映射参数。请参阅为字段指定分析器

如果未指定这些参数,则使用 standard 分析器

为查询指定搜索分析器

编辑

在编写全文查询时,可以使用 analyzer 参数来指定搜索分析器。如果提供,则此参数会覆盖任何其他搜索分析器。

以下 搜索 API 请求将 stop 分析器设置为 match 查询的搜索分析器。

resp = client.search(
    index="my-index-000001",
    query={
        "match": {
            "message": {
                "query": "Quick foxes",
                "analyzer": "stop"
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      match: {
        message: {
          query: 'Quick foxes',
          analyzer: 'stop'
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  query: {
    match: {
      message: {
        query: "Quick foxes",
        analyzer: "stop",
      },
    },
  },
});
console.log(response);
GET my-index-000001/_search
{
  "query": {
    "match": {
      "message": {
        "query": "Quick foxes",
        "analyzer": "stop"
      }
    }
  }
}

为字段指定搜索分析器

编辑

在映射索引时,可以使用 search_analyzer 映射参数来为每个 text 字段指定一个搜索分析器。

如果提供了搜索分析器,则还必须使用 analyzer 参数指定索引分析器。

以下 创建索引 API 请求将 simple 分析器设置为 title 字段的搜索分析器。

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "title": {
                "type": "text",
                "analyzer": "whitespace",
                "search_analyzer": "simple"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        title: {
          type: 'text',
          analyzer: 'whitespace',
          search_analyzer: 'simple'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      title: {
        type: "text",
        analyzer: "whitespace",
        search_analyzer: "simple",
      },
    },
  },
});
console.log(response);
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 索引的默认搜索分析器。

resp = client.indices.create(
    index="my-index-000001",
    settings={
        "analysis": {
            "analyzer": {
                "default": {
                    "type": "simple"
                },
                "default_search": {
                    "type": "whitespace"
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          default: {
            type: 'simple'
          },
          default_search: {
            type: 'whitespace'
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    analysis: {
      analyzer: {
        default: {
          type: "simple",
        },
        default_search: {
          type: "whitespace",
        },
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "simple"
        },
        "default_search": {
          "type": "whitespace"
        }
      }
    }
  }
}