Skip to content

Search with MoreLikeThisQuery should use Pageable. #1787

Closed
@xwlcn

Description

@xwlcn

Step 1:

MoreLikeThisQuery query = new MoreLikeThisQuery();
query.setId(stringIdRepresentation(extractIdFromBean(entity)));
query.setPageable(pageable);    //set in this, but don't use

if (fields != null) {
	query.addFields(fields);
}

SearchHits<T> searchHits = execute(operations -> operations.search(query, entityClass, getIndexCoordinates()));
AggregatedPage<SearchHit<T>> page = SearchHitSupport.page(searchHits, pageable);
return (Page<T>) SearchHitSupport.unwrapSearchHits(page);

Step 2: Look into<T> SearchHits<T> search(MoreLikeThisQuery query, Class<T> clazz, IndexCoordinates index);:

public <T> SearchHits<T> search(MoreLikeThisQuery query, Class<T> clazz, IndexCoordinates index) {

	Assert.notNull(query.getId(), "No document id defined for MoreLikeThisQuery");

	MoreLikeThisQueryBuilder moreLikeThisQueryBuilder = requestFactory.moreLikeThisQueryBuilder(query, index);
	return search(new NativeSearchQueryBuilder().withQuery(moreLikeThisQueryBuilder).build(), clazz, index);
}

Step 3: It seems no problem, then look intorequestFactory.moreLikeThisQueryBuilder(query, index);:

public MoreLikeThisQueryBuilder moreLikeThisQueryBuilder(MoreLikeThisQuery query, IndexCoordinates index) {

	String indexName = index.getIndexName();
	MoreLikeThisQueryBuilder.Item item = new MoreLikeThisQueryBuilder.Item(indexName, query.getId());

	String[] fields = query.getFields().toArray(new String[] {});

	MoreLikeThisQueryBuilder moreLikeThisQueryBuilder = QueryBuilders.moreLikeThisQuery(fields, null,
			new MoreLikeThisQueryBuilder.Item[] { item });

	if (query.getMinTermFreq() != null) {
		moreLikeThisQueryBuilder.minTermFreq(query.getMinTermFreq());
	}

	if (query.getMaxQueryTerms() != null) {
		moreLikeThisQueryBuilder.maxQueryTerms(query.getMaxQueryTerms());
	}

	if (!isEmpty(query.getStopWords())) {
		moreLikeThisQueryBuilder.stopWords(query.getStopWords());
	}

	if (query.getMinDocFreq() != null) {
		moreLikeThisQueryBuilder.minDocFreq(query.getMinDocFreq());
	}

	if (query.getMaxDocFreq() != null) {
		moreLikeThisQueryBuilder.maxDocFreq(query.getMaxDocFreq());
	}

	if (query.getMinWordLen() != null) {
		moreLikeThisQueryBuilder.minWordLength(query.getMinWordLen());
	}

	if (query.getMaxWordLen() != null) {
		moreLikeThisQueryBuilder.maxWordLength(query.getMaxWordLen());
	}

	if (query.getBoostTerms() != null) {
		moreLikeThisQueryBuilder.boostTerms(query.getBoostTerms());
	}

	return moreLikeThisQueryBuilder;
}

Ok, you can see MoreLikeThisQuery's pageable property is missing, I found this issue in the 3.x version, and it still exists in the 4.x version.

In step 2, modify below

return search(new NativeSearchQueryBuilder().withQuery(moreLikeThisQueryBuilder).build(), clazz, index);

to

return search(new NativeSearchQueryBuilder().withPageable(query.getPageable()).withQuery(moreLikeThisQueryBuilder).build(), clazz, index);

can fix it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions