Поиск с Elasticsearch для точного соответствия текста - PullRequest
0 голосов
/ 26 февраля 2020

Я хочу найти ТОЧНУЮ область работы в строке ниже, сейчас она возвращает все записи, соответствующие области работы, а также любые другие, содержащие это слово.

Например, если я ищу для Финансы , он также возвращает мне Корпоративные финансы . Кто-нибудь может подсказать, как заставить эту строку возвращать только точные совпадения?

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

1 Ответ

0 голосов
/ 26 февраля 2020

Вместо того, чтобы искать в анализируемом поле, вам нужно будет искать в неанализированном поле, оптимизированном для точных совпадений.

Вы не предоставили отображение своего индекса (я тоже не уверен какой клиент вы используете), я просто предполагаю сопоставление по умолчанию для строковых полей.

Что может помочь в следующих изменениях:

  • использовать совпадение вместо фразы совпадения (фраза делает не имеет смысла для точных совпадений)
  • использовать поле типа ключевого слова (не проанализированная версия текста)

Имейте в виду, что с вышеуказанными изменениями необходимо сопоставить точная строка в том виде, в каком она была проиндексирована (та же заглавная буква, тот же интервал и т. д. c.)

boolQuery.should(QueryBuilders.matchQuery("audiences.areasOfWork.keyword", areaOfWork));
...