当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch Rest高级客户端重新映射错误

窦啸
2023-03-14

我正在尝试创建一个类,该类将通过Rest高级客户机自动写入ElasticSearch,并执行操作(create、createBatch、remove、removeBatch、update、updateBatch),这些操作都正常工作,我的测试用例都成功。为了增加一点灵活性,我想实现以下方法:(find、findAll、getFirsts(n)、getLasts(n))。find(key)和findAll()都可以很好地工作,但getFirsts(n)和getLasts(n)根本不能。

以下是上下文:在每个测试用例之前-

以下是我的测试对象的映射:

{
  "properties": {
    "date": { "type": "long" },
    "name": { "type": "text" },
    "age": { "type": "integer" },
    "uniqueKey": { "type": "keyword" }
  }
}

这是我的测试用例:

@Test
public void testGetFirstByIds() throws BeanPersistenceException {
    List<StringTestDataBean> beans = new ArrayList<>();
    StringTestDataBean bean1 = new StringTestDataBean();
    bean1.setName("Tester");
    bean1.setAge(22);
    bean1.setTimeStamp(23213987321712L);
    beans.add(elasticSearchService.create(bean1));

    StringTestDataBean bean2 = new StringTestDataBean();
    bean1.setName("Antonio");
    bean1.setAge(27);
    bean1.setTimeStamp(2332321117321712L);
    beans.add(elasticSearchService.create(bean2));

    Assert.assertNotNull("The beans created should not be null", beans);
    Assert.assertEquals("The uniqueKeys of the fetched list should match the existing",
            beans.stream()
                .map(ElasticSearchBean::getUniqueKey)
                .sorted((b1,b2) -> Long.compare(Long.parseLong(b2),Long.parseLong(b1)))
                .collect(Collectors.toList()),

            elasticSearchService.getFirstByIds(2).stream()
                .map(ElasticSearchBean::getUniqueKey)
                .collect(Collectors.toList())
    );
}

下面是GetFirstById(n):

@Override
public Collection<B> getFirstByIds(int entityCount) throws BeanPersistenceException {
    assertBinding();
    FilterContext filterContext = new FilterContext();
    filterContext.setLimit(entityCount);
    filterContext.setSort(Collections.singletonList(new FieldSort("uniqueKey",true)));
    return Optional.ofNullable(find(filterContext)).orElseThrow();
}

以下是查找(filterContext):

@Override
public List<B> find(FilterContext filter) throws BeanPersistenceException {
    assertBinding();
    BoolQueryBuilder query = QueryBuilders.boolQuery();
    List<FieldFilter> fields = filter.getFields();
    StreamUtil.ofNullable(fields)
            .forEach(fieldFilter -> executeFindSwitchCase(fieldFilter,query));

    SearchSourceBuilder builder = new SearchSourceBuilder().query(query);
    builder.from((int) filter.getFrom());
    builder.size(((int) filter.getLimit() == -1) ? FILTER_LIMIT : (int) filter.getLimit());

    SearchRequest request = new SearchRequest();
    request.indices(index);
    request.source(builder);
    List<FieldSort> sorts = filter.getSort();
    StreamUtil.ofNullable(sorts)
            .forEach(fieldSort -> builder.sort(SortBuilders.fieldSort(fieldSort.getField()).order(
                    fieldSort.isAscending() ? SortOrder.ASC : SortOrder.DESC)));

    try {
        if (strict)
            client.indices().refresh(new RefreshRequest(index), RequestOptions.DEFAULT);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        List<B> results = new ArrayList<>();

        for (SearchHit hit : hits)
            results.add(objectMapper.readValue(hit.getSourceAsString(), clazz));

        return results;
    }
    catch(IOException e){
        logger.error(e.getMessage(),e);
    }
    return null;
}

如果我多次运行测试用例,就会出现问题。第一次,测试通过得很好,但是每当我们到达第二个测试时,我都会得到一个异常:

ElasticsearchStatusException[Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]
]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=Fielddata is disabled on text fields by default. Set fielddata=true on [name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.]];

在环顾了一天多之后,我意识到地图从原始地图(在开始时指定的地图)发生了变化,它会自动创建:

"test": {
        "aliases": {},
        "mappings": {
            "properties": {
                "age": {
                    "type": "long"
                },
                "name": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "timeStamp": {
                    "type": "long"
                },
                "uniqueKey": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        }

正如我所看到的,映射会自动更改并抛出错误。谢谢你的帮助!

共有1个答案

白飞飙
2023-03-14

仅当插入文档时字段不存在映射时,Elastic才会创建动态映射。检查put映射调用是否在文档添加到索引之前发生。如果映射是静态应用的,请确保将文档插入到正确的索引中。

 类似资料:
  • JPA是一个随Java规范发布的库。 因此,它支持实体持久性的所有面向对象的概念。 到目前为止,我们已经完成了对象关系映射的基础知识。 本章将指导您完成对象和关系实体之间的高级映射。 继承策略 继承是面向对象语言的核心概念,因此我们可以使用实体之间的继承关系或策略。 JPA支持三种类型的继承策略,例如SINGLE_TABLE,JOINED_TABLE和TABLE_PER_CONCRETE_CLAS

  • 我正在尝试从ElasticSearch 2过渡到5或6。我想我想直接跳到6.1.1并使用RestHighLevelClient,因为它比低级rest客户端更接近我正在使用的现有传输客户端。 但是,我遇到了一个问题作为集成测试的一部分,我正在创建索引并插入特定数据,因此我知道我的查询是正确的。我似乎无法在High Level客户端中做到这一点。特别是,我希望能够调用: 但是,client.indic

  • 使用Elasticsearch原生Java客户端API()的应用程序升级到使用Java高级REST客户端的路径是什么? 文件(初步?)似乎表明: Java高级REST客户端依赖于Elasticsearch核心项目。它接受与TransportClient相同的请求参数,并返回相同的响应对象。 (来源:https://www.elastic.co/guide/en/elasticsearch/clie

  • 问题内容: 在我的文件中,我尝试实现一些映射,其中使用不同的分析器将属于一种类型的一个字段索引到其余字段。 目前,yaml文件具有以下结构: 这不会将自定义分析器应用于标题字段,因此我希望有人可以为我指出将自定义分析器应用于各个字段的正确方向? 问题答案: 我在ml中回答了这个问题: 如果您使用的是Java,则不必使用yml文件。您可以,但不必。 如果您使用的是Spring,则可以查看ES spr

  • 问题内容: 我正在尝试使用以下行重新索引: 但是我在kibana控制台中遇到以下错误: 谁能告诉我这个问题是什么以及如何摆脱它。 问题答案: 504只是意味着请求仍在运行,但是从Kibana到ES的HTTP连接超时。 您仍然可以使用任务管理API来查看请求的执行情况,如下所示:

  • 6.3.1. 有序集合(Sorted collections) Hibernate 支持实现 java.util.SortedMap 和 java.util.SortedSet 的集合。你必须在映射文件中指定一个比较器: <set name="aliases" table="person_aliases" sort="natural">