Тип запроса Combined_Fields в OpenSearch

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

Запрос combined_fields относится к группе полнотекстовых запросов, которые позволяют искать в анализируемом текстовом поле (например, в сообщении об ошибке).

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

Анализатор - это просто компонент, который строится из трех более мелких компонентов: фильтров символов, токенизаторов и фильтров токенов, встроенных или настраиваемых. Эти строительные блоки предварительно упаковываются в анализаторы для различных языков и видов текста встроенными анализаторами. Отдельные строительные блоки также открыты OpenSearch, что позволяет объединять их для создания новых пользовательских анализаторов.

Для чего используется этот запрос?

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

Запрос combined_fields работает, ориентируясь на термины. Он анализирует строку запроса до отдельных терминов, а затем ищет каждый термин в любом из полей. Этот запрос можно использовать вместо запроса cross fields multi_match. Он предлагает более понятное поведение и более надежную систему оценки. Запрос combined_fields работает только с полями с одинаковым поисковым анализатором, в то время как запросу multi_match все равно, есть ли у полей одинаковый поисковый анализатор или нет.

Параметры верхнего уровня в запросе combined_fields

Запрос combined_fields имеет шесть параметров верхнего уровня: fields, query, auto_generate_synonyms_phrase_query, operator, minimum_should_match и zero_terms_query.

  • fields: массив строк, обязательный параметр, представляющий собой список полей, по которым вы хотите искать. Допускаются только текстовые поля, и все они должны использовать один и тот же поисковый анализатор. Использование шаблонов подстановочных знаков в полях разрешено.
  • query: строковое поле, обязательное для заполнения, представляет собой текст, который следует искать в полях, указанных в параметре fields. Перед выполнением поиска запрос combined_fields анализирует предоставленный текст.
  • auto_generate_synonyms_phrase_query: булевский параметр, необязательный, значение по умолчанию - true. Если установлено значение true, то для многотерминальных синонимов запросы на совпадение фраз генерируются автоматически.
  • operator: строковый параметр, необязательный, представляет булеву логику, используемую для интерпретации текста в значении запроса.

Для параметров оператора существует два допустимых значения:

  • "OR " - значение по умолчанию. Например, значение запроса "data mining" интерпретируется как "data OR mining".
  • "AND ", как в примере ниже, значение запроса "data mining" интерпретируется как "data AND mining".

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

Параметр minimum_should_match имеет шесть возможных значений, которые

  • Integer: задает фиксированное значение независимо от количества необязательных пунктов. Пример целочисленного значения для параметра minimum_should_match - 4.
  • Negative integer:: указывает, что все количество необязательных пунктов, за вычетом данного числа, должно быть обязательным. Примером отрицательного целочисленного значения для параметра minimum_should_match является -3.
  • Percentage: указывает, что должен быть заполнен данный процент от общего числа необязательных пунктов. Число в процентах округляется вниз и используется как минимальное. Пример процентного значения для параметра minimum_should_match - 73 %.
  • Negative percentage: указывает, что данный процент от общего числа необязательных пунктов может отсутствовать. Число в процентах округляется в меньшую сторону перед вычитанием из общего числа для определения минимума. Примером отрицательного процентного значения для параметра minimum_should_match является -20 %.
  • Combination: Представляет собой условную спецификацию, состоящую из положительного числа, за которым следует знак less-than и любой из ранее упомянутых спецификаторов. Оно указывает, что если количество необязательных пунктов равно или меньше целого числа, то все они необходимы; однако если оно больше целого числа, то спецификация применяется. Примером комбинированного значения для параметра minimum_should_match является 4<80%, в данном примере: если имеется от 1 до 4 пунктов, то все они обязательны, но для 5 и более пунктов требуется только 80%.
  • Multiple combinations: Несколько условных спецификаций могут быть разделены пробелами, причем каждая из них действительна только для значений, больших, чем предыдущая. Пример множественных комбинаций для значения параметра minimum_should_match - 2<-25% 9<-3, в этом примере: при наличии 1 или 2 пунктов требуются оба пункта, при наличии 3-9 пунктов требуются все пункты, кроме 25%, а при наличии более 9 пунктов требуются все пункты, кроме трех.
  • zero_terms_query: строковый тип, необязательный, представляет, не будет ли возвращено ни одного документа, если анализатор удалит все лексемы, а также при использовании стоп-фильтра. Параметр zero_terms_query имеет два допустимых значения, а именно:
    • 1. "none" (значение по умолчанию) - указывает, что ни один документ не будет возвращен, если анализатор удалит все лексемы.
    • 2. "all" - возвращает все документы, как и запрос match_all.

Как это реализовать

В приведенном ниже примере запрос combined_fields будет рассматривать запрос с ориентацией на термин, анализируя строку запроса "data mining" на два отдельных термина, которые являются терминами "data" и "mining". Затем он обращается к оператору "and", поэтому будет искать термины "данные" и "добыча" в любом из полей "summary", "abstract" и "content".

В заключение можно сказать, что приведенный выше поисковый запрос будет искать в индексе my_index документы, в которых термины data и mining содержатся в любом из полей summary, abstract и content. Он вернет документы, в которых термины data и mining присутствуют хотя бы в одном из этих полей.

Основанный на простой формуле BM25F, запрос combined_fields обеспечивает систематический подход к подсчету баллов. Алгоритм BM25F - один из самых успешных алгоритмов сходства в веб-поиске и корпоративном поиске. В его основе лежит Probabilistic Relevance Framework (PRF), который является формальной основой для поиска документов.

Для понимания алгоритма BM25F рекомендуется прочитать книгу The Probabilistic Relevance Framework: BM25 and Beyond, особенно главу derived models, в которой есть раздел BM25F, который поможет вам понять механизм работы BM25F.

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

Запрос интегрирует статистику терминов и коллекций по полям при оценке совпадений. Это позволяет оценивать каждое совпадение так, как если бы все выбранные поля были объединены в одно поле. (Пожалуйста, обратите внимание, что это лучшая попытка; combined_fields делает некоторые оценки, и оценки не будут точно следовать этой модели).

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

В запросе combined_fields требуется, чтобы boosts поля был равен или больше 1.0, допускается дробный.

Когда следует использовать запрос multi_match или запрос combined_fields?

Основные различия

Основное различие между запросом combined_fields и запросом multi_match заключается в том, что запрос combined_fields поддерживает только текстовые поля и принимает текстовые поля, имеющие один и тот же поисковый анализатор. Запрос multi_match, напротив, поддерживает как текстовые, так и нетекстовые поля, а также принимает текстовые поля, не имеющие общего поискового анализатора.

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

Запрос multi_match может быть более подходящим, если вам нужен один запрос, который обрабатывает поля различных типов, например ключевые слова или целые числа. Он позволяет использовать как текстовые, так и нетекстовые поля, а также текстовые поля с разными анализаторами.

Второе различие между этими двумя режимами заключается в том, что режимы best_fields и most_fields multi_match рассматривают запрос с точки зрения полей. Combined_fields, с другой стороны, ориентирован на термин, при этом оператор и minimum_should_match применяются к каждому термину, а не к каждому полю.

Режим cross_fields multi_match дополнительно применяет оператор и minimum_should_match для каждого термина и использует подход, ориентированный на термин. Ключевым преимуществом режима combined_fields перед cross_fields является надежная и интерпретируемая стратегия оценки алгоритма BM25F.

Запрос combined_fields имеет более простой API, чем запрос multi_match, и в нем отсутствуют многие параметры, включая анализатор, нечеткость и все связанные с ними параметры, а также lenient, slop и tie_breaker.

Примечания и полезные сведения

  • В запросе combined_fields количество полей, которые могут быть запрошены одновременно, ограничено. Оно определяется настройками поиска indices.query.bool.max_clause_count, которые по умолчанию установлены на 1024.
  • В настоящее время в запросе combined_fields поддерживается только сходство BM25 (оно используется по умолчанию, если не настроено пользовательское сходство). Сходство по_полю также не допускается. В каждом из этих случаев использование combined_fields приведет к ошибке.
  • Основное преимущество combined_fields - надежный и понятный алгоритм оценки.
Понравилась статья? Поделиться с друзьями:
Добавить комментарий