【问题标题】:Search in a collection of nested objects在嵌套对象集合中搜索
【发布时间】:2020-06-15 13:41:44
【问题描述】:

我有 elasticSearch 7.4。我有一个地址模型和条目类型的嵌套模型“部分”:

@Document(indexName = "address", createIndex = true)
public class Address {
    @Id
    @Field(type = FieldType.Text, store = true)
    public String id;

    @Field(type = FieldType.Text)
    private String fullAddress;

    private String regionCode;
    private boolean customQuery = true;
    private boolean root;

    @Field(type = FieldType.Nested, store = true)
    private List<Entry> parts;

    @Field(type = FieldType.Nested, store = true)
    private House house;
}

public class Entry {
    private String aoid;
    private String aoGuid;
    private String code;
    private String offName;
    private String parentGuid;
    private String shortName;
    @Field(type = FieldType.Integer)
    private Integer aoLevel;
    private String postalCode;
}

我想在 Entry 列表中的 AoGuid 字段上写一个搜索:

@Override
public List<Address> findForHouse(String aoguid) {
    SearchSourceBuilder builder = new SearchSourceBuilder();
    NestedQueryBuilder findByparts = nestedQuery(
            "parts",
            termQuery("parts.aoGuid", aoguid),
            ScoreMode.None);
    TermQueryBuilder findByRoot = termQuery("root", true);

    QueryBuilder findByIdAndLocation = QueryBuilders.boolQuery()
            .filter(findByRoot)
            .filter(findByparts);

    builder.query(findByIdAndLocation);

    String[] strings = new String[]{"address"};
    SearchRequest request = new SearchRequest(strings, builder);
    try {
        restHighLevelClient.search(request, RequestOptions.DEFAULT);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

当我调用我的搜索方法时,我得到一个错误:

org.elasticsearch.ElasticsearchStatusException: Elasticsearch 异常 [type=search_phase_execution_exception, reason=all shards 失败] org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:177) ~[elasticsearch-7.4.0.jar:7.4.0] 在 org.elasticsearch.client.RestHighLevelClient.parseEntity(RestHighLevelClient.java:1727) ~[elasticsearch-rest-high-level-client-7.4.0.jar:7.4.0] 在 org.elasticsearch.client.RestHighLevelClient.parseResponseException(RestHighLevelClient.java:1704) ~[elasticsearch-rest-high-level-client-7.4.0.jar:7.4.0] 在 org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1467) ~[elasticsearch-rest-high-level-client-7.4.0.jar:7.4.0] 在 org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1424) ~[elasticsearch-rest-high-level-client-7.4.0.jar:7.4.0] 在 org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1394) ~[elasticsearch-rest-high-level-client-7.4.0.jar:7.4.0] 在 org.elasticsearch.client.RestHighLevelClient.search(RestHighLevelClient.java:930) ~[elasticsearch-rest-high-level-client-7.4.0.jar:7.4.0] 在 ru.evolenta.server.service.elastic.impl.ElasticQueryAddressServiceImpl.findForHouse(ElasticQueryAddressServiceImpl.java:117) 〜[类/:na]在 ru.evolenta.server.service.async.impl.AsyncHouseElasticServiceImpl.lambda$saveFias$1(AsyncHouseElasticServiceImpl.java:45) 〜[类/:na]在 java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) ~[na:1.8.0_201] 在 java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[na:1.8.0_201] 在 java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_201] 在 java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:291) ~[na:1.8.0_201] 在 java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731) ~[na:1.8.0_201] 在 java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) ~[na:1.8.0_201] 在 java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:401) ~[na:1.8.0_201] 在 java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:734) ~[na:1.8.0_201] 在 java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:160) ~[na:1.8.0_201] 在 java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:174) ~[na:1.8.0_201] 在 java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233) ~[na:1.8.0_201] 在 java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) ~[na:1.8.0_201] 在 java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:583) ~[na:1.8.0_201] 在 ru.evolenta.server.service.async.impl.AsyncHouseElasticServiceImpl.saveFias(AsyncHouseElasticServiceImpl.java:42) ~[classes/:na] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)~[na:1.8.0_201] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201] 在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201] 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:338) ~[spring-aop-5.0.4.RELEASE.jar:5.0.4.RELEASE] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:197) ~[spring-aop-5.0.4.RELEASE.jar:5.0.4.RELEASE] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.0.4.RELEASE.jar:5.0.4.RELEASE] 在 org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-5.0.4.RELEASE.jar:5.0.4.RELEASE] 在 java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) ~[na:1.8.0_201] 在 java.util.concurrent.FutureTask.run(FutureTask.java) ~[na:1.8.0_201] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_201] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_201] 在 java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_201] 抑制: org.elasticsearch.client.ResponseException:方法 [POST],主机 [http://localhost:9200], URI [/address/_search?typed_keys=true&ignore_unavailable=false&expand_wildcards=open&allow_no_indices=true&ignore_throttled=true&search_type=query_then_fetch&batched_reduce_size=512&ccs_minimize_roundtrips=true], 状态行 [HTTP/1.1 400 错误请求] {"错误":{"root_cause":[{"type":"query_shard_exception","re​​ason":"失败 创建查询: {\n \"bool\" : {\n \"filter\" : [\n {\n
\"term\" : {\n \"root\" : {\n \"value\" : true,\n \"提升\" : 1.0\n }\n }\n },\n {\n
\"嵌套\" : {\n \"查询\" : {\n \"术语\" : {\n
\"parts.aoGuid\" : {\n \"value\" : \"2d598ce8-feaf-4fb0-9320-bcad370a5d52\",\n \"boost\" : 1.0\n }\n }\n },\n \"path\" : \"parts\",\n \"ignore_unmapped\" : false,\n
\"score_mode\" : \"none\",\n \"boost\" : 1.0\n }\n
}\n ],\n \"adjust_pure_negative\" : true,\n \"boost\" : 1.0\n }\n}","index_uuid":"jqAtS-hiQOS08lKfa1nWqw","index":"address"}],"type":"search_phase_execution_exception","re​​ason":"all 碎片 失败","阶段":"查询","分组":true,"failed_shards":[{"shard":0,"index":"address","node":"G_1M-1l6SOyy7YHWBk2SSQ","re​​ason" :{"type":"query_shard_exception","re​​ason":"失败 创建查询: {\n \"bool\" : {\n \"filter\" : [\n {\n
\"term\" : {\n \"root\" : {\n \"value\" : true,\n \"提升\" : 1.0\n }\n }\n },\n {\n
\"嵌套\" : {\n \"查询\" : {\n \"术语\" : {\n
\"parts.aoGuid\" : {\n \"value\" : \"2d598ce8-feaf-4fb0-9320-bcad370a5d52\",\n \"boost\" : 1.0\n }\n }\n },\n \"path\" : \"parts\",\n \"ignore_unmapped\" : false,\n
\"score_mode\" : \"none\",\n \"boost\" : 1.0\n }\n
}\n ],\n \"adjust_pure_negative\" : true,\n \"boost\" : 1.0\n }\n}","index_uuid":"jqAtS-hiQOS08lKfa1nWqw","index":"address","caused_by":{"type":"illegal_state_exception","re​​ason":"[嵌套] 路径 [parts] 下的嵌套对象不是嵌套的 键入"}}}]},"status":400}
在 org.elasticsearch.client.RestClient.convertResponse(RestClient.java:253) ~[elasticsearch-rest-client-7.4.0.jar:7.4.0] 在 org.elasticsearch.client.RestClient.performRequest(RestClient.java:231) ~[elasticsearch-rest-client-7.4.0.jar:7.4.0] 在 org.elasticsearch.client.RestClient.performRequest(RestClient.java:205) ~[elasticsearch-rest-client-7.4.0.jar:7.4.0] 在 org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1454) ~[elasticsearch-rest-high-level-client-7.4.0.jar:7.4.0] ... 32 常用框架省略

我该如何解决这个问题?

【问题讨论】:

    标签: java elasticsearch spring-data-elasticsearch


    【解决方案1】:

    检查你的索引模板是嵌套类型的parts字段吗? 如果您可以发布您的模板,那就太好了。

    【讨论】:

      【解决方案2】:

      我想我可以通过编写自定义查询来解决问题:

      @Query("{\n" +
              "  \"bool\": {\n" +
              "    \"must\": [\n" +
              "      {\n" +
              "        \"match\": {\n" +
              "          \"parts.aoGuid\": \"?1\"\n" +
              "        }\n" +
              "      },\n" +
              "      {\n" +
              "        \"query_string\": {\n" +
              "          \"query\": \"?0\",\n" +
              "          \"fields\": [\n" +
              "            \"root\"\n" +
              "          ]\n" +
              "        }\n" +
              "      }\n" +
              "    ]\n" +
              "  }\n" +
              "}")
      List<Address> findByRootAndAoGuidInParts(boolean root, String aoguid);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2020-09-06
        • 1970-01-01
        • 2018-03-20
        相关资源
        最近更新 更多