несколько regexpQuery против одного matchQuery с включенными полевыми данными

Допустим, у меня есть объект 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

Какой подход будет лучше в этом случае?


person bluesony    schedule 12.10.2020    source источник


Ответы (1)


Не уверен, каков ваш прецедент, простой полнотекстовый поиск не требует включения fielddata в текстовом поле (отключено по умолчанию), и, как вы уже знаете, это дорого не рекомендуется, и вместо этого вы должны иметь поле .keyword для вашего text поле и выполните сортировку, агрегацию по этому полю.

Просматривая свой поисковый запрос, вы не выполняете сортировку, агрегацию, поэтому вам не следует использовать данные поля. Кроме того, запросы регулярных выражений стоят дорого, и если вы можете предоставить свой вариант использования, мы можем предложить вам лучший способ построения этих запросов.

person user156327    schedule 12.10.2020
comment
я также буду выполнять некоторые операции сортировки, поэтому я планировал использовать ключевое слово .keyword для них. Но меня больше всего беспокоило то, что несколько запросов регулярных выражений могут оказать еще большее влияние на производительность, чем включение полевых данных. Кроме того, второй подход не полностью функционален, так как мне также нужно будет искать части нескольких слов. Вариант использования — что-то вроде форума или приложения для обмена сообщениями. - person bluesony; 12.10.2020
comment
@sodomark извините, похоже, я пропустил ваш комментарий, в любом случае, чтобы ответить на ваши вопросы, вы должны избегать запросов регулярных выражений, если можете (ведущий подстановочный знак, если вы можете заблокировать это, было бы здорово), и вы можете выполнять сортировку, агрегацию по полям ключевых слов - person user156327; 20.11.2020
comment
@sodomark lmk, если у вас есть дополнительные вопросы, и, пожалуйста, проголосуйте и примите ответ, если он был полезен, TIA :) - person user156327; 20.11.2020