Elasticsearch采坑实践总结

【1】java.lang.AbstractMethodError

异常如下:

org.elasticsearch.transport.TcpTransport.connectToChannels(Lorg/elasticsearch/cluster/node/DiscoveryNode;Lorg/elasticsearch/transport/ConnectionProfile;)Lorg/elasticsearch/transport/TcpTransport$NodeChannels;

这种类似错误,通常是由于版本问题造成的。这里es版本是5.2.2,自动引入的netty版本是5.6.8,那么降低transport-netty4-client版本与elasticsearch保持一致即可。
Elasticsearch采坑实践总结_第1张图片
pom如下:

	 
        
            org.elasticsearch
            elasticsearch
            5.2.2
        
        
        
            org.elasticsearch.client
            transport
            5.2.2
            
                
                    transport-netty4-client
                    org.elasticsearch.plugin
                
            
        

        
            org.elasticsearch.plugin
            transport-netty4-client
            5.2.2
        

【2】 java.lang.IllegalArgumentException:Can only use fuzzy queries on keyword and text fields - not on [createDate] which is of type [date]

异常实例:

Caused by: java.lang.IllegalArgumentException: Can only use fuzzy queries on keyword and text fields - not on [createDate] which is of type [date]
	at org.elasticsearch.index.mapper.MappedFieldType.fuzzyQuery(MappedFieldType.java:354)
	at org.elasticsearch.index.query.FuzzyQueryBuilder.doToQuery(FuzzyQueryBuilder.java:341)
	at org.elasticsearch.index.query.AbstractQueryBuilder.toQuery(AbstractQueryBuilder.java:97)
	at org.elasticsearch.index.query.QueryShardContext.lambda$toQuery$1(QueryShardContext.java:312)
	at org.elasticsearch.index.query.QueryShardContext.toQuery(QueryShardContext.java:329)
	... 14 more

原因分析

模糊查询不能适用于type==date 的字段,只能使用于type==keyword|text


【3】java.lang.IllegalArgumentException: Unable to identify index name. Person is not a Document. Make sure the document class is annotated with @Document(indexName=“foo”)

异常实例如下:

java.lang.IllegalArgumentException: Unable to identify index name. Person is not a Document. Make sure the document class is annotated with @Document(indexName="foo")
	at org.springframework.util.Assert.isTrue(Assert.java:118) ~[spring-core-5.2.0.RELEASE.jar:5.2.0.RELEASE]
	at org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate.getPersistentEntityFor(ElasticsearchRestTemplate.java:1527) ~[spring-data-elasticsearch-3.2.3.RELEASE.jar:3.2.3.RELEASE]
	at bleHandlerMethod.java:138) ~[spring-web-5.2.0.RELEASE.jar:5.2.0.RELEASE]
//...

背景原因分析:

	 @PostMapping("/person")
    public String save(@RequestBody Person person) {

        IndexQuery indexQuery = new IndexQueryBuilder()
                .withId(person.getId().toString())
                .withObject(person)
                .build();
        String documentId = elasticsearchOperations.index(indexQuery);
        return documentId;
    }

代码中直接用ES操作对象,那么需要对对象添加注解进行映射,Object Mapping,可以点击参考该文档。

解决方案

给Person添加映射注解,如下所示:

@Document(indexName = "person",type = "person")
public class Person {

    @Id
    private Integer id;
    @Field
    private String name;
    //...
}

你可能感兴趣的:(#,Elasticsearch)