Elasticsearch从索引

时间:2016-08-11 06:15:58

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

我不知道为什么elasticsearch没有为索引设置合适的值,并输入。他需要从index =拍卖和类型=拍卖中检索数据,就像在模型中一样:

AuctionIndex.java:

@Document(indexName = "auctions", type = "auctions")
public class AuctionIndex {
    @Id
    private String id;
    private Long cat;
    private Long tcat;
    private String curr;
    private Long price;
    private Long start_date;
    private Long end_date;
    private String title;
    private String pow;
    private String woj;
    private String loc;
    private String cat_name;
    private Long catdec;
    private Long uid;
    private Long qty;
    ...getters and setters...
}

此代码在下载数据时有效:

public Map searchByIndexParams(AuctionIndexSearchParams searchParams, Pageable pageable) {
        Map response = new HashMap();
        NativeSearchQuery searchQuery = this.getSearchQuery(searchParams, pageable).build();
        final FacetedPage<AuctionIndex> search = auctionIndexRepository.search(searchQuery);

        List<AuctionIndex> content = search.getContent();

        response.put("content", content.stream().map(row -> {
            return Auction.builder()
                    .cat(row.getCat())
                    .item(Long.parseLong(row.getId()))
                    .endts(row.getEnd_date())
                    .startts(row.getStart_date())
                    .loc(row.getLoc())
                    .pow(row.getPow())
                    .woj(row.getWoj())
                    .price(row.getPrice())
                    .qty(row.getQty())
                    .title(row.getTitle())
                    .user(row.getUid())
                    .catName(row.getCat_name())
                    .build();
        }).collect(Collectors.toList()));
        response.put("first", search.isFirst());
        response.put("last", search.isLast());
        response.put("number", search.getNumber());
        response.put("numberOfElements", search.getNumberOfElements());
        response.put("size", search.getSize());
        response.put("sort", search.getSort());
        response.put("totalElements", search.getTotalElements());
        response.put("totalPages", search.getTotalPages());

        return response;
    }

以这种方式下载所有记录:

public Map findAllByIndexParams(AuctionIndexSearchParams searchParams, Pageable pageable) {
        List rows = new ArrayList();
        Map response = new HashMap();

        final List<FilterBuilder> filters = Lists.newArrayList();
        final NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery());
        Optional.ofNullable(searchParams.getCategoryId()).ifPresent(v -> filters.add(boolFilter().must(termFilter("cat", v))));
        Optional.ofNullable(searchParams.getCurrency()).ifPresent(v -> filters.add(boolFilter().must(termFilter("curr", v))));
        Optional.ofNullable(searchParams.getTreeCategoryId()).ifPresent(v -> filters.add(boolFilter().must(termFilter("tcat", v))));
        Optional.ofNullable(searchParams.getUid()).ifPresent(v -> filters.add(boolFilter().must(termFilter("uid", v))));

        final BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        //access for many uids
        if (searchParams.getUids() != null) {
            if (searchParams.getItemId() != null || searchParams.getTitle() != null) {
                Optional.ofNullable(searchParams.getUids().split(",")).ifPresent(v -> {
                    filters.add(boolFilter().must(termsFilter("uid", v)));
                });
            } else {
                for (String user : searchParams.getUids().split(",")) {
                    boolQueryBuilder.should(queryStringQuery(user).field("uid"));
                }
            }
        }
        //access for many categories
        if (searchParams.getCategories() != null) {
            Optional.ofNullable(searchParams.getCategories().split(",")).ifPresent(v -> {
                filters.add(boolFilter().must(termsFilter("cat", v)));
            });
        }
        if (searchParams.getItemId() != null) {
            boolQueryBuilder.must(queryStringQuery(searchParams.getItemId()).field("_id"));
        }
        if (Optional.ofNullable(searchParams.getTitle()).isPresent()) {
            boolQueryBuilder.must(queryStringQuery(searchParams.getTitle()).analyzeWildcard(true).field("title"));
        }
        if (searchParams.getLoc() != null) {
            filters.add(boolFilter().must(termsFilter("loc", searchParams.getLoc())));
//            boolQueryBuilder.must(queryStringQuery(searchParams.getLoc()).field("loc"));
        }
        if (searchParams.getPow() != null) {
            filters.add(boolFilter().must(termsFilter("pow", searchParams.getPow())));
//            boolQueryBuilder.must(queryStringQuery(searchParams.getPow()).field("pow"));
        }
        if (searchParams.getWoj() != null) {
            filters.add(boolFilter().must(termsFilter("woj", searchParams.getWoj())));
//            boolQueryBuilder.must(queryStringQuery(searchParams.getWoj()).field("woj"));
        }
        if (searchParams.getCatdec() != null) {
            boolQueryBuilder.must(queryStringQuery(String.valueOf(searchParams.getCatdec())).field("catdec"));
        }
        if (Optional.ofNullable(searchParams.getStartDateFrom()).isPresent()
                || Optional.ofNullable(searchParams.getStartDateTo()).isPresent()) {
            filters.add(rangeFilter("start_date").from(searchParams.getStartDateFrom()).to(searchParams.getStartDateTo()));
        }

        if (Optional.ofNullable(searchParams.getEndDateFrom()).isPresent()
                || Optional.ofNullable(searchParams.getEndDateTo()).isPresent()) {
            filters.add(rangeFilter("end_date").from(searchParams.getEndDateFrom()).to(searchParams.getEndDateTo()));
        }

        if (Optional.ofNullable(searchParams.getPriceFrom()).isPresent()
                || Optional.ofNullable(searchParams.getPriceTo()).isPresent()) {
            filters.add(rangeFilter("price").from(searchParams.getPriceFrom()).to(searchParams.getPriceTo()));
        }

        searchQuery.withQuery(boolQueryBuilder);

        FilterBuilder[] filterArr = new FilterBuilder[filters.size()];
        filterArr = filters.toArray(filterArr);
        searchQuery.withFilter(andFilter(filterArr));

        if (searchParams.getOrderBy() != null && searchParams.getOrderDir() != null) {
            if (searchParams.getOrderDir().toLowerCase().equals("asc")) {
                searchQuery.withSort(SortBuilders.fieldSort(searchParams.getOrderBy()).order(SortOrder.ASC));
            } else {
                searchQuery.withSort(SortBuilders.fieldSort(searchParams.getOrderBy()).order(SortOrder.DESC));
            }
        }

        String scrollId = searchTemplate.scan(searchQuery.build(), 100000, false);


        System.out.println(scrollId);
        Page<AuctionIndex> page = searchTemplate.scroll(scrollId, 500000, AuctionIndex.class);
        System.out.println(page.getTotalElements());
        if (page.hasContent()) {
            while (true) {
                for (AuctionIndex hit : page.getContent()) {
                    Auction row = Auction.builder()
                            .cat(hit.getCat())
                            .item(Long.parseLong(hit.getId()))
                            .endts(hit.getEnd_date())
                            .startts(hit.getStart_date())
                            .loc(hit.getLoc())
                            .pow(hit.getPow())
                            .woj(hit.getWoj())
                            .price(hit.getPrice())
                            .qty(hit.getQty())
                            .title(hit.getTitle())
                            .user(hit.getUid())
                            .catName(hit.getCat_name())
                            .build();
                    rows.add(row);
                }
                page = searchTemplate.scroll(scrollId, 500000, AuctionIndex.class);
                if (page.hasContent() == false) {
                    break;
                }
            }

        }

        response.put("content", rows);
        return response;
    }

AuctionService.java:

private AuctionRepository auctionRepository;
    private AuctionIndexRepository auctionIndexRepository;

    @Autowired
    public AuctionService(AuctionRepository auctionRepository, AuctionIndexRepository auctionIndexRepository) {
        this.auctionRepository = auctionRepository;
        this.auctionIndexRepository = auctionIndexRepository;
    }
    @Autowired
    private ElasticsearchTemplate searchTemplate;

AuctionIndexRepository.java:

public interface AuctionIndexRepository extends ElasticsearchRepository<AuctionIndex, Integer> {

}

AuctionRepository.java:

@Repository
public class AuctionRepository {

    private final AerospikeClient aerospikeClient;

    @Autowired
    public AuctionRepository(AerospikeClient aerospikeClient) {
        this.aerospikeClient = aerospikeClient;
    }

    /**
     *
     * @param auctionId
     * @param transactionIndexId
     * @return
     */
    public Map findTransactionAuctionById(Long auctionId, String transactionIndexId) {
        final Statement stmt = new Statement();
        stmt.setNamespace(NAMESPACE_ALLEK);
        stmt.setSetName(SET_U);

        final Map<String, Object> aMap = findAuctionUserInSetA(auctionId);
        final Key uKey = new Key(NAMESPACE_ALLEK, SET_U, aMap.get("u") + "_" + aMap.get("p"));
        final Object uRecord = aerospikeClient.execute(null, uKey, NAMESPACE_ALLEK, FUN_FIND_U_ITEM, Value.get(auctionId));

        return parseTransactionAuction((HashMap) uRecord, auctionId, transactionIndexId);
    }

    /**
     *
     * @param r
     * @return
     */
    private Map parseTransactionAuction(HashMap r, Long auctionId, String transactionIndexId) {
        return parseTransactionAuction(new Record(r, 0, 0), auctionId, transactionIndexId);
    }

    /**
     *
     * @param r rekord z aerospike
     * @return
     * @return
     */
    private Map parseTransactionAuction(Record r, Long auctionId, String transactionIndexId) {
        Map response = new HashMap();
        final Object recordTrans = r.getValue("t");
        final ArrayList<HashMap> trans = Optional.ofNullable(recordTrans).isPresent() ? (ArrayList<HashMap>) recordTrans : new ArrayList<>();
        Object qty = 0;
        Object price = 0;
        for (HashMap hit : trans) {
            if (transactionIndexId.equals(auctionId + "_" + hit.get("buyer") + "_" + hit.get("ts"))) {
                qty = hit.get("qty");
                price = hit.get("price");
                break;
            }
        }

        response.put("qty", qty);
        response.put("price", price);
        response.put("startts", r.getLong("startts"));
        response.put("endts", r.getLong("endts"));
        response.put("qty_auction", r.getLong("qty"));
        return response;
    }

    public AuctionRaw findAuctionRawById(Long auctionId) {
        final Statement stmt = new Statement();
        stmt.setNamespace(NAMESPACE_ALLEK);
        stmt.setSetName(SET_U);

        final Map<String, Object> aMap = findAuctionUserInSetA(auctionId);
        final Key uKey = new Key(NAMESPACE_ALLEK, SET_U, aMap.get("u") + "_" + aMap.get("p"));
        final Object uRecord = aerospikeClient.execute(null, uKey, NAMESPACE_ALLEK, FUN_FIND_U_ITEM, Value.get(auctionId));

        return parseAuctionRaw((HashMap) uRecord);
    }

    private AuctionRaw parseAuctionRaw(HashMap r) {
        return parseAuctionRaw(new Record(r, 0, 0));
    }

    private AuctionRaw parseAuctionRaw(Record r) {
        return AuctionRaw.builder()
                .cat(r.getLong("cat"))
                .len(r.getInt("len"))
                .start(r.getLong("start"))
                .build();
    }

    public Auction findAuctionById(Long auctionId) {
        final Statement stmt = new Statement();
        stmt.setNamespace(NAMESPACE_ALLEK);
        stmt.setSetName(SET_U);

        final Map<String, Object> aMap = findAuctionUserInSetA(auctionId);
        final Key uKey = new Key(NAMESPACE_ALLEK, SET_U, aMap.get("u") + "_" + aMap.get("p"));
        final Object uRecord = aerospikeClient.execute(null, uKey, NAMESPACE_ALLEK, FUN_FIND_U_ITEM, Value.get(auctionId));
        return parseAuction((HashMap) uRecord);
    }

    public Map<String, Object> findAuctionUserInSetA(Long auctionId) {
        final Statement stmt = new Statement();
        stmt.setNamespace(NAMESPACE_ALLEK);
        stmt.setSetName(SET_U);

        final Key aKey = new Key(NAMESPACE_ALLEK, SET_A, Value.get(auctionId / 1024));
        final Map<String, Object> aMap = (Map<String, Object>) aerospikeClient.execute(null, aKey, NAMESPACE_ALLEK, FUN_FIND_A_ITEM, Value.get(auctionId));
        return aMap;
    }

    public List<Auction> findAuctionByUserId(Long userId) {
        final Statement stmt = new Statement();
        stmt.setNamespace(NAMESPACE_ALLEK);
        stmt.setSetName(SET_U);
        stmt.setFilters(Filter.equal("u", userId));

        final RecordSet records = aerospikeClient.query(null, stmt);
        return StreamSupport.stream(records.spliterator(), true)
                .flatMap(l -> {
                    final ArrayList<HashMap> auctionsFromRecord = (ArrayList<HashMap>) l.record.getValue("v");
                    return Optional.ofNullable(auctionsFromRecord).isPresent() ? auctionsFromRecord.stream() : Stream.<HashMap>empty();
                })
                .map(r -> parseAuction(r))
                .collect(Collectors.toList());
    }

    private Auction parseAuction(HashMap r) {
        return parseAuction(new Record(r, 0, 0));
    }

    private Auction parseAuction(Record r) {
//        final Object recordTrans = r.getValue("t");
//        final ArrayList<HashMap> trans = Optional.ofNullable(recordTrans).isPresent() ? (ArrayList<HashMap>) recordTrans : new ArrayList<>();
//        final List<Transaction> transactions = trans.stream()
//                .map(m -> {
//                    HashMap recordComment = (HashMap) m.get("c");
//                    Comment comment = null;
//                    if (recordComment != null && recordComment.size() > 0) {
//                        comment = Comment.builder()
//                                .id((Long) recordComment.get("id"))
//                                .ts((Long) recordComment.get("ts"))
//                                .text((String) recordComment.get("text"))
//                                .type((Long) recordComment.get("type"))
//                                .build();
//                    }
//                    return Transaction.builder()
//                            .ts((Long) m.get("ts"))
//                            .qty((Long) m.get("qty"))
//                            .price((Long) m.get("price"))
//                            .c(comment)
//                            .buyer((Long) m.get("buyer"))
//                            .build();
//                })
//                .collect(Collectors.toList());

        return Auction.builder()
                .item(r.getLong("item"))
                .startts(r.getLong("startts"))
                .endts(r.getLong("endts"))
                .user(r.getLong("user"))
                .qty(r.getLong("qty"))
                .price(r.getLong("price"))
                .title(r.getString("title"))
                .cat(r.getLong("cat"))
                //                .tcat(r.getLong("tcat"))
                //                .curr(r.getString("curr"))
                .loc(r.getString("loc"))
                .woj(r.getString("woj"))
                .pow(r.getString("pow"))
                .catName(r.getString("cat_name"))
                //                .t(transactions)
                //                .len(r.getInt("len"))
                //                .detSt(r.getLong("det_st"))
                //                .detLen(r.getLong("det_len"))
                //                .start(r.getLong("start"))
                .build();
    }
}

我不知道为什么但是滚动从旧的index = allek和type = auctions中检索数据。

我如何知道旧索引?因此,旧索引的结果等于16k(只有更多的数据,还有其他字段,而不是新索引),而新索引中的结果是大约400的记录。

我的问题是为什么会发生这种情况?我应该改变什么才能使用滚动条配置索引=拍卖和类型=拍卖?

我向你求助,我不知道为什么会这样。

0 个答案:

没有答案