如果想要在创建索引和查询时分别使用不同的分词器,ElasticSearch也是支持的。
-
在创建索引,指定analyzer,ES在创建时会先检查是否设置了analyzer字段,如果没定义就用ES预设的
-
在查询时,指定search_analyzer,ES查询时会先检查是否设置了search_analyzer字段,如果没有设置,还会去检查创建索引时是否指定了analyzer,还是没有还设置才会去使用ES预设的
ES分析器主要有两种情况会被使用:
- 插入文档时,将text类型的字段做分词然后插入倒排索引,此时就可能用到analyzer指定的分词器
- 在查询时,先对要查询的text类型的输入做分词,再去倒排索引搜索,此时就可能用到search_analyzer指定的分词器
//createIndex 默认为true,表示当Spring启动扫描到ElasticsearchRepository接口及其子接口时,如果配置的索引不存在,则Spring会创建索引
//useServerConfiguration = true表示当Spring创建索引时,Spring不会在创建的索引中设置以下设置:shards,replicas,refreshInterval和indexStoreType.这些设置将是Elasticsearch默认值(服务器配置).
@Document(indexName = "user", shards = 1, replicas = 0, createIndex = true)
public class User {
@Id //指定ES索引结构
private Integer id;
@Field(type = FieldType.Keyword)
private String username;
private Integer age;
//指定某个字段分词器
@Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_max_word")
private String desc;
public User() {
}
public User(Integer id, String username) {
this.id = id;
this.username = username;
}
public User(Integer id, String username, Integer age, String desc) {
this.id = id;
this.username = username;
this.age = age;
this.desc = desc;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return JSONObject.toJSONString(this);
}
}