@Field(type = FieldType.keyword)在某些属性上被忽略

时间:2017-11-02 14:12:01

标签: elasticsearch spring-data-elasticsearch

我遇到了SD Elasticsearch在应用程序启动时创建一些索引的问题。我有一些String字段,我希望它是“关键字”类型,但它们始终被创建为“text”类型。这是使用Elasticsearch 5.5.1,Spring 5.0.0,Spring Data Kay-RELEASE。

作为一个例子,我有类似的内容:

// DepartmentSearchResult.java
@Document(indexName = "hr_index", type = "department", createIndex = false)
public class DepartmentSearchResult implements Serializable {
    @Id private String id;

    private String foo;
    // other fields, getters, setters etc. omitted
}

// DepartmentSearchingRepository.java
public interface DepartmentSearchingRepository extends ElasticsearchRepository<DepartmentSearchResult, String> {}

// ApplicationStartupListener.java
@Component
public class ApplicationStartupListener implements ApplicationListener<ContextRefreshedEvent> {
    @Autowired ElasticsearchTempalte elasticSearchTemplate;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        if (!elasticSearchTemplate.indexExists(DepartmentSearchResult.class)) {
            elasticSearchTemplate.createIndex(DepartmentSearchResult.class);
            elasticSearchTemplate.putMapping(DepartmentSearchResult.class);
        }
    }
}

(我将createIndex设置为false并改为使用ApplicationStartupListener,因为我在How to correctly address "can't add a _parent field that points to an already existing type, that isn't already a parent" on app startup询问了一个问题。如果这与某种方式有关,请将其包括在内。)

无论如何,我希望DepartmentSearchResult.id是关键字,而不是文本。所以,我改变了:

@Id private String id;

为:

@Field(type=FieldType.keyword) @Id private String id;

然后我删除索引并重启我的应用程序。创建索引和映射,但“id”始终创建为文本,而不是关键字。其他领域正常运作;如果我将foo更改为映射中显示为关键字的@Field(type=FieldType.keyword) private String foo;,那么这个id字段就是我无法工作的。

我目前的解决方法是手动创建映射,如:

curl -s -X PUT http://localhost:9200/hr_index/_mapping/department -d '{
    "properties": {
        "id": {
            "type": "keyword"
        }
    }
}'

这是有效的,但我更喜欢Spring只是动态创建映射,所以我不需要维护一个单独的映射安装脚本。我应该看的任何地方可能表明为什么这个字段会被创建为“文本”?

0 个答案:

没有答案