禁用Elasticsearch中文档中所有字段的索引字段

时间:2016-11-15 15:24:49

标签: java spring elasticsearch spring-data-jpa spring-data-elasticsearch

  • 我在我的Java Spring应用程序中使用elasticsearch,因为使用了springsearch Spring JPA。 我在java中有一个文档和相应的类,其中包含所有不应编入索引的字段(我使用java api中的termFilter语句搜索它们以获得完全匹配) 在我的情况下,我必须注释每个字段

    @Field(type = FieldType.String,index = FieldIndex.not_analyzed)

我得到这样的东西

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@Document(indexName = "message", type = "message")
public class Message implements Serializable {

    @Id
    @NotNull
    @JsonProperty("id")
    private String id;

    @JsonProperty("userName")
    @Field(type = FieldType.String, index = FieldIndex.not_analyzed)
    private String userName;


    @NotNull
    @JsonProperty("topic")
    @Field(index = FieldIndex.not_analyzed, type = FieldType.String)
    private String topic;

    @NotNull
    @JsonProperty("address")
    @Field(index = FieldIndex.not_analyzed, type = FieldType.String)
    private String address;

    @NotNull
    @JsonProperty("recipient")
    @Field(index = FieldIndex.not_analyzed, type = FieldType.String)
    private String recipient;


}

是否有可能在类上添加注释,以便不在所有字段上复制它?

1 个答案:

答案 0 :(得分:1)

使用原始映射+ dynamic templates,您可以在没有@Field注释的情况下实现目标。 使用@Mapping注释

在json文件中指定映射的路径
@Mapping(mappingPath = "/mappings.json")

然后在mappings.json中定义您的映射:

{
  "mappings": {
    "message": {
        "dynamic_templates": [
            { "notanalyzed": {
                  "match":              "*", 
                  "match_mapping_type": "string",
                  "mapping": {
                      "type":        "string",
                      "index":       "not_analyzed"
                  }
               }
            }
          ]
       }
   }
}

注意:我没有测试过,所以请检查拼写错误。