使用 Elasticsearch 搜索完全匹配的文本
Searching with Elasticsearch for exact matching text
我想在下面的行中搜索确切的工作领域,现在它 return 包含与工作领域匹配的所有记录以及包含该词的任何其他记录。
例如,如果我搜索 Finance,它也会 return搜索我 Corporate Finance。任何人都可以建议如何将此行设为 return 完全匹配吗?
boolQuery.should(QueryBuilders.matchPhraseQuery("audiences.areasOfWork", areaOfWork));
boolQuery.should(QueryBuilders.matchPhraseQuery("audiences.interests", interest));
BoolQueryBuilder filterQuery = boolQuery();
filterQuery.must(QueryBuilders.matchQuery("audiences.grades", grade));
filterQuery.must(QueryBuilders.matchQuery("status", status));
filterQuery.mustNot(QueryBuilders.matchQuery("audiences.type", "Valid"));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(boolQuery)
.withFilter(filterQuery)
.withSort(SortBuilders.scoreSort().order(SortOrder.DESC))
.withPageable(pageable)
.build();
return operations.queryForPage(searchQuery, Course.class);
您需要在未分析的字段中搜索,而不是在已分析的字段中搜索,并针对精确匹配进行了优化。
您没有共享索引的映射(我也不确定您使用的是哪个客户端),我只是假定字符串字段的默认映射。
以下更改可能会有所帮助:
- 使用匹配而不是匹配短语(短语对完全匹配没有意义)
- 使用关键字类型的字段(文本未分析版本)
请记住,进行上述更改后,您需要在索引时准确匹配字符串(相同的大小写、相同的间距等)
boolQuery.should(QueryBuilders.matchQuery("audiences.areasOfWork.keyword", areaOfWork));
我想在下面的行中搜索确切的工作领域,现在它 return 包含与工作领域匹配的所有记录以及包含该词的任何其他记录。
例如,如果我搜索 Finance,它也会 return搜索我 Corporate Finance。任何人都可以建议如何将此行设为 return 完全匹配吗?
boolQuery.should(QueryBuilders.matchPhraseQuery("audiences.areasOfWork", areaOfWork));
boolQuery.should(QueryBuilders.matchPhraseQuery("audiences.interests", interest));
BoolQueryBuilder filterQuery = boolQuery();
filterQuery.must(QueryBuilders.matchQuery("audiences.grades", grade));
filterQuery.must(QueryBuilders.matchQuery("status", status));
filterQuery.mustNot(QueryBuilders.matchQuery("audiences.type", "Valid"));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(boolQuery)
.withFilter(filterQuery)
.withSort(SortBuilders.scoreSort().order(SortOrder.DESC))
.withPageable(pageable)
.build();
return operations.queryForPage(searchQuery, Course.class);
您需要在未分析的字段中搜索,而不是在已分析的字段中搜索,并针对精确匹配进行了优化。
您没有共享索引的映射(我也不确定您使用的是哪个客户端),我只是假定字符串字段的默认映射。
以下更改可能会有所帮助:
- 使用匹配而不是匹配短语(短语对完全匹配没有意义)
- 使用关键字类型的字段(文本未分析版本)
请记住,进行上述更改后,您需要在索引时准确匹配字符串(相同的大小写、相同的间距等)
boolQuery.should(QueryBuilders.matchQuery("audiences.areasOfWork.keyword", areaOfWork));