elasticsearch

时间:2017-03-17 06:41:52

标签: java elasticsearch spring-boot spring-data-jpa

我们说我们有一个实体" 设备"它包含其他实体" DeviceInfo ",我们有一个实体" 网站"其中包含" DeviceInfo "的列表实体和" DeviceInfo "有一个" 设备"和" 网站"在它的属性。

我的任务是找到一个" 网站"中的所有" 设备"对于某个端点,我会发送一个" 网站" id和页码和页面大小(因为它必须是可分页的)。我通过创建JPA规范

使其工作
public static Specification<Device> bySearchRequest(final DeviceSearchRequest searchRequest)  {
        return (root, query, cb) -> {
            final Join<Device, DeviceInfo> deviceInfo
                    = root.join(Device_.deviceInfo, JoinType.LEFT);
            final Join<DeviceInfo, Site> site
                    = deviceInfo.join(DeviceInfo_.site, JoinType.LEFT);

            return cb.and(cb.equal(site.get(Site.id), searchRequest.getSiteId()));
        };
    } 

然后使用我会将&#34; 设备&#34;转换为ES中的&#34; IndexDevice &#34; s。

deviceRepository.findAll(currentUser,
                DeviceRepository.Specs.bySearchRequest(searchRequest),
                new PageRequest(searchRequest.getPage(), searchRequest.getSize()))
                .getContent().stream().map(x ->indexedDeviceConverter.convert(x)).collect(Collectors.toList());

就是这样。有用。但是我在这里从数据库获取数据,我已经在Elasticsearch中拥有了所有内容。有没有办法让同样的查询直接从ES获取数据( with paging )?

唯一区别在于ES&#34; IndexedDevice &#34;与&#34; IndexedSite &#34;有直接关系。 (没有&#34; IndexedDeviceInfo &#34;)。

IndexedDevice

{  
  "id":"3eba5104-0c7a-4564-8270-062945cc8f5e",
  "name":"D4",
  "site":{  
        "id":"46e7ada4-3f34-4962-b849-fac59c8fe8ad",
        "name":"SomeSite",
        "displayInformation":"SomeSite",
        "subtitle":""
  },
  "suggest":{  
        "input":[]
  },
  "displayInformation":"D4",
  "subtitle":""
}

IndexedSite

{
   "id": "46e7ada4-3f34-4962-b849-fac59c8fe8ad",
   "name": "SomeSite",
   "displayInformation": "SomeSite",
   "subtitle": ""
}

1 个答案:

答案 0 :(得分:0)

我设法做到了。最后它非常简单。我使用了ElasticsearchRepository(org.springframework.data.elasticsearch.repository)。

elasticsearchRepositoy.search(QueryBuilders.termsQuery
                ("site.id",
                searchRequest.getSite()),
                new PageRequest(searchRequest.getPage(),
                searchRequest.getSize()));