Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Query DSL ›Полные текстовые запросы

Запрос интервалов

Возвращает документы на основе порядка и близости совпадающих терминов.

Запрос intervals использует правила соответствия, сконструированные из небольшого набора определений. Затем эти правила применяются к терминам из указанного field.

Определения производят последовательности минимальных интервалов, охватывающих термины в тексте. Эти интервалы могут быть дополнительно объединены и отфильтрованы родительскими источниками.

Пример запроса

Следующий intervals поиск возвращает документы, содержащие my favorite food без каких-либо промежутков, за которыми следует hot water или cold porridge в поле my_text.

Этот поиск будет соответствовать значению my_text, равного my favorite food is cold porridge, но не when it's cold my favorite food is porridge.

POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "all_of" : {
          "ordered" : true,
          "intervals" : [
            {
              "match" : {
                "query" : "my favorite food",
                "max_gaps" : 0,
                "ordered" : true
              }
            },
            {
              "any_of" : {
                "intervals" : [
                  { "match" : { "query" : "hot water" } },
                  { "match" : { "query" : "cold porridge" } }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

Параметры верхнего уровня для intervals

<field>

(Обязательный, объект правила) Поле, которое вы хотите искать.

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

Допустимые правила включают:

  • match
  • prefix
  • wildcard
  • fuzzy
  • all_of
  • any_of

match параметры правила

Правило match сопоставляет проанализированный текст.

query
(Обязательный, строка) Текст, который вы хотите найти в предоставленном <field>.
max_gaps

(Необязательный, целое число) Максимальное количество позиций между совпадающими терминами. Термины, расположенные дальше, чем это, не рассматриваются как совпадения. По умолчанию -1.

Если не указано или установлено значение -1, на соответствие не накладывается ограничение по ширине. Если установлено значение 0, термины должны появляться рядом друг с другом.

ordered
(Необязательный, булево) Если true, совпадающие термины должны появляться в указанном порядке. По умолчанию false.
analyzer
(Необязательный, строка) анализатор, используемый для анализа терминов в query. По умолчанию — анализатор верхнего уровня <field>.
filter
(Необязательный, объект правила фильтра интервалов) Необязательный фильтр интервалов.
use_field
(Необязательный, строка) Если указано, тогда соответствовать интервалам из этого поля, а не верхнего уровня <field>. Термины анализируются с использованием анализатор поиска из этого поля. Это позволяет искать по нескольким полям, как если бы они были одним полем; например, вы можете индексировать один и тот же текст в стемированных и нестемированных полях и искать стемированные токены рядом с нестемированными.

prefix параметры правила

Правило prefix сопоставляет термины, начинающиеся с заданного набора символов. Этот префикс может расширяться для сопоставления максимум с 128 терминами. Если префикс соответствует более чем 128 терминам, Elasticsearch возвращает ошибку. Вы можете использовать параметр index-prefixes в отображении поля, чтобы избежать этого ограничения.

prefix
(Обязательный, строка) Начальные символы терминов, которые вы хотите найти в верхнем уровне <field>.
analyzer
(Необязательный, строка) анализатор, используемый для нормализации prefix. По умолчанию — анализатор верхнего уровня <field>.
use_field

(Необязательный, строка) Если указано, то соответствовать интервалам из этого поля, а не верхнего уровня <field>.

prefix нормализуется с использованием анализатор поиска из этого поля, если не указан отдельный analyzer.

wildcard параметры правила

Правило wildcard сопоставляет термины с помощью шаблона с подстановкой. Этот шаблон может расширяться для сопоставления максимум 128 терминов. Если шаблон сопоставляется с более чем 128 терминами, Elasticsearch возвращает ошибку.

pattern

(Обязательный, строка) Шаблон подстановки, используемый для поиска соответствующих терминов.

Этот параметр поддерживает два оператора подстановки:

  • ?, который сопоставляет любой отдельный символ
  • *, который может сопоставлять ноль или более символов, включая пустой

Избегайте шаблонов, начинающихся с * или ?. Это может увеличить количество итераций, необходимых для поиска соответствующих терминов, и замедлить производительность поиска.

analyzer
(Необязательный, строка) анализатор, используемый для нормализации pattern. По умолчанию — анализатор верхнего уровня <field>.
use_field

(Необязательный, строка) Если указано, сопоставлять интервалы из этого поля, а не верхнего уровня <field>.

pattern нормализуется с использованием анализатор поиска из этого поля, если не указан отдельно analyzer.

fuzzy параметры правила

Правило fuzzy сопоставляет термины, похожие на предоставленный термин, в пределах расстояния редактирования, определенного в Fuzziness. Если расширение fuzzy соответствует более чем 128 терминам, Elasticsearch возвращает ошибку.

term
(Обязательный, строка) Термин для сопоставления
prefix_length
(Необязательный, целое число) Количество начальных символов, оставшихся неизменными при создании расширений. По умолчанию 0.
transpositions
(Необязательный, булево) Указывает, включают ли правки транспозиции двух соседних символов (ab → ba). По умолчанию true.
fuzziness
(Необязательный, строка) Максимальное расстояние редактирования, разрешенное для соответствия. См. Fuzziness для допустимых значений и дополнительной информации. По умолчанию auto.
analyzer
(Необязательный, строка) анализатор, используемый для нормализации term. По умолчанию — анализатор верхнего уровня <field>.
use_field

(Необязательный, строка) Если указано, сопоставлять интервалы из этого поля, а не верхнего уровня <field>.

term нормализуется с использованием анализатор поиска из этого поля, если не указан отдельно analyzer.

all_of параметры правила

Правило all_of возвращает совпадения, охватывающие комбинацию других правил.

intervals
(Обязательный, массив объектов правила) Массив правил для объединения. Все правила должны соответствовать документу для соответствия общему источнику.
max_gaps

(Необязательный, целое число) Максимальное количество позиций между совпадающими терминами. Произведенные правилами интервалы, расположенные дальше, чем это, не рассматриваются как совпадения. По умолчанию -1.

Если не указано или установлено значение -1, на соответствие не накладывается ограничение по ширине. Если установлено значение 0, термины должны появляться рядом друг с другом.

ordered
(Необязательный, булево) Если true, интервалы, созданные правилами, должны появляться в том порядке, в котором они указаны. По умолчанию false.
filter
(Необязательный, объект правила фильтра интервалов) Правило, используемое для фильтрации возвращаемых интервалов.

any_of параметры правила

Правило any_of возвращает интервалы, полученные любым из его подправил.

intervals
(Обязательный, массив объектов правил) Массив правил для сопоставления.
filter
(Необязательный, объект правила фильтра интервалов) Правило, используемое для фильтрации возвращаемых интервалов.

filter параметры правила

Правило filter возвращает интервалы на основе запроса. См. пример фильтра для примера.

after
(Необязательный, объект запроса) Запрос, используемый для возврата интервалов, которые следуют за интервалом из правила filter.
before
(Необязательный, объект запроса) Запрос, используемый для возврата интервалов, которые предшествуют интервалу из правила filter.
contained_by
(Необязательный, объект запроса) Запрос, используемый для возврата интервалов, содержащихся в интервале из правила filter.
containing
(Необязательный, объект запроса) Запрос, используемый для возврата интервалов, которые содержат интервал из правила filter.
not_contained_by
(Необязательный, объект запроса) Запрос, используемый для возврата интервалов, которые не содержатся в интервале из правила filter.
not_containing
(Необязательный, объект запроса) Запрос, используемый для возврата интервалов, которые не содержат интервал из правила filter.
not_overlapping
(Необязательный, объект запроса) Запрос, используемый для возврата интервалов, которые не перекрываются с интервалом из правила filter.
overlapping
(Необязательный, объект запроса) Запрос, используемый для возврата интервалов, которые перекрываются с интервалом из правила filter.
script
(Необязательный, объект скрипта) Скрипт, используемый для возврата соответствующих документов. Этот скрипт должен возвращать булево значение, true или false. См. фильтры скриптов для примера.

Примечания

Пример фильтра

Следующий поиск включает правило filter. Он возвращает документы, содержащие слова hot и porridge в пределах 10 позиций друг от друга без слова salty между ними:

POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "match" : {
          "query" : "hot porridge",
          "max_gaps" : 10,
          "filter" : {
            "not_containing" : {
              "match" : {
                "query" : "salty"
              }
            }
          }
        }
      }
    }
  }
}

Фильтры скриптов

Вы можете использовать скрипт для фильтрации интервалов на основе их начальной позиции, конечной позиции и количества внутренних пробелов. Следующий скрипт filter использует переменную interval с методами start, end и gaps:

POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "match" : {
          "query" : "hot porridge",
          "filter" : {
            "script" : {
              "source" : "interval.start > 10 && interval.end < 20 && interval.gaps == 0"
            }
          }
        }
      }
    }
  }
}

Минимизация

Запрос интервалов всегда минимизирует интервалы, чтобы запросы могли выполняться за линейное время. Это иногда может приводить к неожиданным результатам, особенно при использовании ограничений или фильтров max_gaps. Например, рассмотрите следующий запрос, ищущий salty внутри фразы hot porridge:

POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "match" : {
          "query" : "salty",
          "filter" : {
            "contained_by" : {
              "match" : {
                "query" : "hot porridge"
              }
            }
          }
        }
      }
    }
  }
}

Этот запрос не находит документ, содержащий фразу hot porridge is salty porridge, потому что интервалы, возвращаемые запросом сопоставления для hot porridge, охватывают только первые два слова в этом документе, и они не перекрываются с интервалами, охватывающими salty.

Еще одно ограничение, о котором следует помнить, — это случай правил any_of, содержащих подправила, которые перекрываются. В частности, если одно из правил является строгим префиксом другого, то более длинное правило никогда не может совпасть, что может привести к неожиданным результатам при использовании в сочетании с max_gaps. Рассмотрим следующий запрос, ищущий the, за которым сразу следует big или big bad, за которым сразу следует wolf:

POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "all_of" : {
          "intervals" : [
            { "match" : { "query" : "the" } },
            { "any_of" : {
                "intervals" : [
                    { "match" : { "query" : "big" } },
                    { "match" : { "query" : "big bad" } }
                ] } },
            { "match" : { "query" : "wolf" } }
          ],
          "max_gaps" : 0,
          "ordered" : true
        }
      }
    }
  }
}

Противоестественно, этот запрос не находит документ the big bad wolf, потому что правило any_of посередине возвращает только интервалы для big — интервалы для big bad длиннее, чем для big, но начинаются с той же позиции, поэтому минимизируются. В таких случаях лучше переформулировать запрос так, чтобы все варианты были явно указаны на верхнем уровне:

POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "any_of" : {
          "intervals" : [
            { "match" : {
                "query" : "the big bad wolf",
                "ordered" : true,
                "max_gaps" : 0 } },
            { "match" : {
                "query" : "the big wolf",
                "ordered" : true,
                "max_gaps" : 0 } }
           ]
        }
      }
    }
  }
}

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-intervals-query.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API