mirror of
https://github.com/typesense/typesense.git
synced 2025-05-18 04:32:38 +08:00
Handle edge case of finding no query tokens in the array.
This commit is contained in:
parent
a73774b005
commit
d58a6e613b
@ -738,25 +738,25 @@ void Collection::highlight_result(const field &search_field,
|
||||
// is from the best matched field and need not be present in other fields of a document.
|
||||
Index* index = indices[field_order_kv.key % num_indices];
|
||||
art_leaf *actual_leaf = index->get_token_leaf(search_field.name, &token_leaf->key[0], token_leaf->key_len);
|
||||
if(actual_leaf != NULL) {
|
||||
if(actual_leaf != nullptr) {
|
||||
query_suggestion.push_back(actual_leaf);
|
||||
std::vector<uint16_t> positions;
|
||||
uint32_t doc_index = actual_leaf->values->ids.indexOf(field_order_kv.key);
|
||||
uint32_t *indices = new uint32_t[1];
|
||||
indices[0] = doc_index;
|
||||
leaf_to_indices.emplace(actual_leaf, indices);
|
||||
auto doc_indices = new uint32_t[1];
|
||||
doc_indices[0] = doc_index;
|
||||
leaf_to_indices.emplace(actual_leaf, doc_indices);
|
||||
}
|
||||
}
|
||||
|
||||
if(query_suggestion.empty()) {
|
||||
// none of the tokens from the query were found on this field
|
||||
return ;
|
||||
}
|
||||
|
||||
// positions in the field of each token in the query
|
||||
std::vector<std::vector<std::vector<uint16_t>>> array_token_positions;
|
||||
Index::populate_token_positions(query_suggestion, leaf_to_indices, 0, array_token_positions);
|
||||
|
||||
if(array_token_positions.size() == 0) {
|
||||
// none of the tokens from the query were found on this field
|
||||
return ;
|
||||
}
|
||||
|
||||
std::vector<match_index_t> match_indices;
|
||||
|
||||
for(size_t array_index = 0; array_index < array_token_positions.size(); array_index++) {
|
||||
@ -771,6 +771,11 @@ void Collection::highlight_result(const field &search_field,
|
||||
match_indices.push_back(match_index_t(this_match, this_match_score, array_index));
|
||||
}
|
||||
|
||||
if(match_indices.empty()) {
|
||||
// none of the tokens from the query were found on this field
|
||||
return ;
|
||||
}
|
||||
|
||||
const size_t max_array_matches = std::min((size_t)MAX_ARRAY_MATCHES, match_indices.size());
|
||||
std::partial_sort(match_indices.begin(), match_indices.begin()+max_array_matches, match_indices.end());
|
||||
|
||||
|
@ -859,7 +859,7 @@ void Index::collate_curated_ids(const std::string & query, const std::string & f
|
||||
uint64_t match_score = 0;
|
||||
|
||||
for(const std::vector<std::vector<uint16_t>> & token_positions: array_token_positions) {
|
||||
if(token_positions.size() == 0) {
|
||||
if(token_positions.empty()) {
|
||||
continue;
|
||||
}
|
||||
const Match & match = Match::match(seq_id, token_positions);
|
||||
@ -1228,7 +1228,7 @@ void Index::score_results(const std::vector<sort_by> & sort_fields, const uint16
|
||||
populate_token_positions(query_suggestion, leaf_to_indices, i, array_token_positions);
|
||||
|
||||
for(const std::vector<std::vector<uint16_t>> & token_positions: array_token_positions) {
|
||||
if(token_positions.size() == 0) {
|
||||
if(token_positions.empty()) {
|
||||
continue;
|
||||
}
|
||||
const Match & match = Match::match(seq_id, token_positions);
|
||||
@ -1288,7 +1288,7 @@ void Index::populate_token_positions(const std::vector<art_leaf *> &query_sugges
|
||||
// for every element in a potential array, for every token in query suggestion, get the positions
|
||||
|
||||
// first ascertain the size of the array
|
||||
size_t array_size = 1;
|
||||
size_t array_size = 0;
|
||||
|
||||
for (const art_leaf *token_leaf : query_suggestion) {
|
||||
size_t this_array_size = 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user