Elasticsearch中analyzer和search_analyzer的区别

2022-07-20 13:49:50

如果想要在创建索引和查询时分别使用不同的分词器,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)publicclassUser{
    @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;publicUser(){}publicUser(Integer id, String username){this.id= id;this.username= username;}publicUser(Integer id, String username, Integer age, String desc){this.id= id;this.username= username;this.age= age;this.desc= desc;}public IntegergetId(){return id;}publicvoidsetId(Integer id){this.id= id;}public StringgetUsername(){return username;}publicvoidsetUsername(String username){this.username= username;}public IntegergetAge(){return age;}publicvoidsetAge(Integer age){this.age= age;}public StringgetDesc(){return desc;}publicvoidsetDesc(String desc){this.desc= desc;}

    @Overridepublic StringtoString(){return JSONObject.toJSONString(this);}}
  • 作者:user2025
  • 原文链接:https://blog.csdn.net/user2025/article/details/108691367
    更新时间:2022-07-20 13:49:50