使用 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));