Допустим, у меня есть объект Subject со списком объектов Message. Я хочу иметь возможность извлекать все предметы, у которых есть сообщения, содержащие несколько слов (например, elasticsearch и data) в их атрибуте body.
Я использую эластичный поиск данных spring для создания NativeSearchQuery.
Один из подходов состоит в том, чтобы НЕ включать полевые данные и выполнять несколько запросов регулярных выражений, подобных этому.
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
for (String word : wordsToSearchFor) {
queryBuilder.filter(QueryBuilders.regexpQuery(message.body, ".*" + word.toLowerCase() + ".*"));
}
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(queryBuilder).build()
Другой подход заключается в том, чтобы включить данные поля и выполнить один запрос, например
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchQuery("message.body", "elasticsearch data"))
.build();
но из того, что я прочитал на официальном эластичном сайте, этот подход не рекомендуется из-за большого использования памяти кучи и низкого времени попадания: https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html
Какой подход будет лучше в этом случае?