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

如何使用Spring数据从elasticsearch读取文档?

孟茂
2023-03-14

我创建了一个索引(house),其类型为“公寓”,包含20个文档。我使用postman将Json作为二进制文件上传到elasticsearch。我有一个Spring Boot项目,它有以下几个类:

>

  • 埃斯孔菲格。java-我已经配置了clustername,它是应用程序中的默认名称。属性文件。

    @Configuration
    @EnableElasticsearchRepositories(basePackages = "com.search.repository")
    public class EsConfig {
    
    @Value("${elasticsearch.clustername}")
    private String EsClusterName;
    
    @Bean
    public Client esClient() throws UnknownHostException {
        Settings esSettings = Settings.builder()
                .put("cluster.name", EsClusterName)
                .put("client.transport.sniff", true)
                .put("client.transport.ignore_cluster_name", false)
                .build();
    
    
       TransportClient  client = new PreBuiltTransportClient(esSettings)
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
        return client;
    
    }
    
    @Bean
    public ElasticsearchOperations elasticsearchTemplate() throws Exception{
        return new ElasticsearchTemplate(esClient()); 
      }
    }
    

    partments.java-这是我的数据模型。这些文档在elasticsearch中有以下字段。

    @Document(indexName = "house", type = "apartments")
    @JsonIgnoreProperties(ignoreUnknown=true)
    public class Apartments {
    
       @Id
       private String id;
       @JsonProperty("Apartment_Name")
       private String apartmentName;
       @JsonProperty("Apartment_ID")
       private String apartmentId;
       @JsonProperty("Area_Name")
       private String areaName;
    
       //constructors along with getters and setters
    }
    

    ApartmentSearchRepository.java-这是一个扩展Elasticsearch chRepository接口以执行crud操作的接口。

    public interface ApartmentSearchRepository extends ElasticsearchRepository<Apartments, String> {
    List<Apartments> findByApartmentName(String apartmentName);
    }
    

    ESA部门服务。爪哇-

    @Service
    public class EsApartmentService {
    
    @Autowired
    ApartmentSearchRepository apartmentSearchRepository;
    
    public List<Apartments> getApartmentByName(String apartmentName) {
        return apartmentSearchRepository.findByApartmentName(apartmentName);
       }
    }
    

    公寓管理员。java——我创建了一个endpoint,可以从elasticsearch返回这20个文档。(此外,在我的项目中,公寓是POJO,公寓是数据模型。)

    @Autowired
    EsApartmentService esApartmentService;
    @GetMapping(path = "/search",produces = "application/json")
    public Set<Apartment> searchApartmentByName(
      @RequestParam(value = "apartmentName", defaultValue = "") String apartmentName) throws IOException {
      List<Apartment> apartments= new ArrayList<>();
      esApartmentService.getApartmentByName(apartmentName).forEach(apartment-> {
            apartments.add(new Apartment(apartment.getApartmentName(), apartment.getApartmentId(), apartment.getAreaName()));
        });
      return apartments.stream()
              .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Apartment::getApartmentId))));
    }
    

    此代码返回状态为200,但响应为空。我尝试调试,但似乎无法从elasticsearch中读取这些文档。我经历了几个解决方案,但其中大多数都从代码本身中设置了文档数据。

    我无法通过点击控制器中指定的endpoint来检索这些文档。有人能告诉我我错过了什么吗?谢谢!:)

  • 共有2个答案

    越学博
    2023-03-14

    如上@ibexit所述,我删除了@JsonProperty,并在我的服务中使用了本机搜索查询生成器。而且,当我给公寓取名字时,它并没有取公寓的名字,而且起了作用。(看起来Elasticsearch有案例问题,所以我把它放在了Camel案例中。)

    我的变化:

    >

  • partments.java-已删除@JsonProperty

    @Document(indexName = "house", type = "apartments")
    //@JsonIgnoreProperties(ignoreUnknown=true)
    public class Apartments {
    
     @Id
     private String id;
    
     //@JsonProperty("apartment_ID")
     private String apartment_ID;
    
     //@JsonProperty("Area_Name")
     private String area_Name;
    
     //@JsonProperty("Apartment_Name")
     private String apartment_Name;
    }
    

    ESA部门服务。爪哇-

    @Service
    public class EsApartmentService {
    @Autowired
    private  ElasticsearchTemplate elasticsearchTemplate; 
    
    public List<Apartments> getApartmentByName(String apartmentName) {
       SearchQuery searchQuery = new NativeSearchQueryBuilder()           
      .withQuery(org.elasticsearch.index.query.QueryBuilders
        .matchQuery("apartment_Name", apartmentName)).build();
    Page<Apartments> sampleEntities = 
        elasticsearchTemplate.queryForPage(searchQuery,Apartments.class);      
    return sampleEntities.getContent();
      }
    }
    

    这些变化给了我所需的响应!:)

  • 荀靖
    2023-03-14

    据我所知,您可以使用@JsonProperty将POJO映射到查询响应,但您正在失去使用Spring数据的动态查找器方法(findBy*)的能力。Spring数据的动态查找器生成依赖于反射,这就是POJO中的字段名称变得重要的地方。

    您介意更改POJO或文档中的字段名以验证这一点吗?还是只定义一个自定义查询?还有一个强大的java api,您可以在其中定义更复杂的查询:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.misc.filter

     类似资料:
    • 本文向大家介绍如何使用JavaScript从* .CSV文件读取数据?,包括了如何使用JavaScript从* .CSV文件读取数据?的使用技巧和注意事项,需要的朋友参考一下 要使用JavaScript读取.CSV,请使用开源CSV解析器Papa Parser。以下是功能- 开源的 使用多线程CSV解析器解析数百万个数据 支持多种网络浏览器 使用解析器,您可以轻松地跳过注释字符 假设您的CSV文件

    • 问题内容: 我正在尝试将数据从一页传递到另一页。 www.mints.com?name=某物 如何使用JavaScript 阅读? 问题答案: 下面的a代码可以工作,并且在不可用的情况下仍然有用,但是它是在JavaScript中没有本机解决方案的时候编写的。在现代浏览器或Node.js中,更喜欢使用内置功能。 用法如下: 它返回一个像这样的对象: 所以 给

    • 我希望从ES中获得聚合结果,例如,对于与术语匹配的文档,

    • 问题内容: 嗨,我习惯了SQL,但是我需要从HBase表读取数据。任何帮助都会很棒。一本书,或者只是一些示例代码,可以从表中读取。有人说使用扫描仪可以解决问题,但我不知道如何使用。 问题答案: 从网站:

    • 我正在尝试读取Mac上pig shell上的csv文件。我所做的只是文件到变量中,然后变量。我是这样做的: 我使用的数据是从这里提供的github下载的 此文件在我的Mac上的本地安装的hdfs中可用。当我执行时,我得到一个错误: org.apache.pig.impl.logicallayer.FrontendException:错误1066:无法打开别名影片的迭代器 在org.apache.p

    • 问题内容: 我正在尝试在onCreate()事件中使用Java API从Android应用程序中的Firebase数据库读取数据。换句话说,我正在尝试做最简单的阅读,相当于… …在Javascript API中。我正在尝试使用addEventListenerForSingleValueEvent()方法,但似乎要我重写onDataChange()方法,这不是我想要的。我想在程序执行到此行时获取数据