当前位置: 首页 > 面试题库 >

Spring Data Elasticsearch的@Field注释不起作用

刁文光
2023-03-14
问题内容

我在pom.xml中有一个带有Spring Data Elasticsearch插件的Spring Boot应用程序。我创建了一个我想索引的文档类:

@Document(indexName = "operations", type = "operation")
public class OperationDocument {

@Id
private Long id;

@Field(
    type = FieldType.String, 
    index = FieldIndex.analyzed, 
    searchAnalyzer = "standard", 
    indexAnalyzer = "standard",
    store = true
)
private String operationName;

@Field(
    type = FieldType.Date, 
    index = FieldIndex.not_analyzed, 
    store = true, 
    format = DateFormat.custom, pattern = "dd.MM.yyyy hh:mm"
)
private Date dateUp;

@Field(
    type = FieldType.String, 
    index = FieldIndex.not_analyzed, 
    store = false
) 
private String someTransientData;

@Field(type = FieldType.Nested)
private List<Sector> sectors;

//Getter and setters

我还为此类创建了一个存储库:

 public interface OperationDocumentRepository 
      extends ElasticsearchRepository<OperationDocument, Long> {
 }

我进行了一个测试,使用存储库对三个示例对象建立了索引。它很长,所以我只发布它。事实是,在ES服务器中创建的映射会忽略@Field批注设置的配置:

"mappings": {
  "operation": {
    "properties": {
      "operationName": {
        "type": "string"
      },
      "dateUp": {
        "type": "long"
      },
      "someTransientData": {
        "type": "string"
      },
      "sectors": {
        "properties": {
          "id": {
            "type": "long"
          },
          "sectorName": {
            "type": "string"
          }
        }
      }
    }
  }
}

没有有关分析器的信息,“ someTransientData”已存储并建立索引,并且dateUp键入为Long而不是Date。

直接从服务器请求的样本文档:

 {
   "_index": "operations",
   "_type": "operation",
   "_id": "AUyUk2cY3nXeOFxdOlQW",
   "_version": 1,
   "_score": 1,
   "_source": {
     "id": null,
     "operationName": "Second Operation Name",
     "dateUp": 1428421827091,
     "someTransientData": "Do not index or store",
     "sectors": [
       {
         "id": 2,
         "sectorName": "Health Care"
       },
       {
         "id": 3,
         "sectorName": "Construction"
       }
     ]
   }
 }

我还注意到,当我第二次运行该应用程序时,在启动时会出现此错误,仅在索引已经存在时才打印:

错误19452 — [main]
.dersAbstractElasticsearchRepository:无法加载elasticsearch节点:org.elasticsearch.index.mapper.MergeMappingException:合并失败,并失败{[mapper
[someTransientData]具有不同的索引值,映射器[someTransientData]具有不同的标记化值,mapper
[someTransientData]具有不同的index_analyzer,对象映射[sectors]无法从非嵌套更改为嵌套,mapper
[operationName]具有不同的存储值,mapper [operationName]具有不同的index_analyzer,mapper
[dateUp]不同类型,current_type [long],merged_type [date]]}

这是Spring Data Elastic Search的错误,还是我做错了什么?

我尝试了Spring Boot提供的稳定版本以及spring-data-
elasticsearch的最后一个快照。我还尝试了插件提供的嵌入式Elasticsearch服务器和当前版本的外部之一。我总是得到相同的结果。


问题答案:

我终于可以复制并解决问题了。事实是,我使用ElasticTemplate而不是存储库来索引和搜索文档,因为我的业务逻辑变得更加复杂(使用聚合等)。

之后,我删除了未使用的OperationDocumentRespository。似乎在启动时将类型映射发布到ES服务器需要该存储库。我以为拥有@Document类应该足够了,但事实并非如此。

因此,我们在这里有两个选择:

  • 保留OperationDocumentRepository
  • 将此行添加到应用程序启动中:
    elasticsearchTemplate.putMapping(OperationDocument.class);
    


 类似资料:
  • 我有一个简单的类叫BeaconDao 然而,当我用@service或@component标记beaconDao时,一切都运行得非常好。有人能看出问题所在吗?

  • 问题内容: 我正在尝试使用Java批注,但似乎无法使我的代码认识到其中存在。我究竟做错了什么? 问题答案: 您需要使用注释界面上的@Retention注释将注释指定为运行时注释。 即

  • 问题内容: 我知道有一些关于此的帖子,但是它们大约一年了,没有任何回应。实际上,我们在PostgreSQL 8.4上使用的是Hibernate 4.2.1.Final。我们有两个这样的实体 实体A(顶级层次结构类) 实体B(子类) 如您所见,使用注释了一个实体,但是当使用来获取顶级类时 我们也通过属性获得了B子类。实际上,SQL语句包含。这仍然是Hibernate第四版中的错误,还是我做错了什么?

  • 问题内容: 我从Spring Framework开始,想做一个带有注释的HelloWorld,我已经创建了一个控制器和一个视图,我猜它是基本的hello工作。但是,我想使用注释,因为我不能再使用SimpleFormController(已弃用)。 我收到的错误是Estado HTTP 404-/av/index.jsp 我正在使用Netbeans,并将示例基于它提供的基本模板。我有以下文件,我可以

  • 问题内容: 什么样的配置是需要使用注解来自像,等等?这是我的代码: 当我尝试在另一个类中使用它时,验证不起作用(即,创建该对象时没有错误): 为什么这不适用和的约束?我还需要做什么? 问题答案: 为了使JSR-303 bean验证在Spring中起作用,您需要做一些事情: 注释的MVC名称空间配置: JSR-303规范JAR :(看起来您已经拥有了) 规范的实现,例如休眠验证,它似乎是最常用的示例