Spec-Zone.ru › Elasticsearch 8
›Руководство по Elasticsearch [8.17] ›DSL запросов ›Запросы на полнотекстовый поиск

Запрос с использованием строки поиска (simple query string query)

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

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

Хотя его синтаксис более ограничен, чем синтаксис query_string запроса, запрос simple_query_string не возвращает ошибок для неверного синтаксиса. Вместо этого он игнорирует любые неверные части строки поиска.

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

resp = client.search(
    query={
        "simple_query_string": {
            "query": "\"fried eggs\" +(eggplant | potato) -frittata",
            "fields": [
                "title^5",
                "body"
            ],
            "default_operator": "and"
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: '"fried eggs" +(eggplant | potato) -frittata',
        fields: [
          'title^5',
          'body'
        ],
        default_operator: 'and'
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    simple_query_string: {
      query: '"fried eggs" +(eggplant | potato) -frittata',
      fields: ["title^5", "body"],
      default_operator: "and",
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "simple_query_string" : {
        "query": "\"fried eggs\" +(eggplant | potato) -frittata",
        "fields": ["title^5", "body"],
        "default_operator": "and"
    }
  }
}

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

query
(Обязательно, строка) Строка поиска, которую требуется разобрать и использовать для поиска. См. синтаксис простой строки поиска.
fields

(Необязательно, массив строк) Массив полей, которые необходимо искать.

Это поле принимает выражения с подстановкой. Вы также можете повысить релевантность совпадений для определенных полей, используя обозначение с символом «^» (^). См. Подстановки и повышение релевантности для полей в параметре fields для примеров.

По умолчанию используется значение из настроек индекса index.query.default_field, которое имеет значение по умолчанию *. Значение * извлекает все поля, подходящие для терм-запросов, и фильтрует метаданные. Затем все извлеченные поля объединяются для создания запроса, если параметр prefix не указан.

Существует ограничение на количество полей, которые можно запросить одновременно. Оно определено настройкой поиска indices.query.bool.max_clause_count, значение по умолчанию которой равно 1024.

default_operator

(Необязательно, строка) Логика по умолчанию для интерпретации текста в строке запроса, если не указаны операторы. Допустимые значения:

OR (По умолчанию)
Например, строка запроса capital of Hungary интерпретируется как capital OR of OR Hungary.
AND
Например, строка запроса capital of Hungary интерпретируется как capital AND of AND Hungary.
analyze_wildcard
(Необязательно, логическое значение) Если true, запрос пытается обработать wildcard термины в строке запроса. Значение по умолчанию false.
analyzer
(Необязательно, строка) Анализатор, используемый для преобразования текста в строке запроса в токены. По умолчанию используется анализатор для индексирования для default_field. Если анализатор не задан, используется анализатор по умолчанию для индекса.
auto_generate_synonyms_phrase_query
(Необязательно, логическое значение) Если true, парсер создаёт match_phrase запрос для каждого многопозиционного токена. Значение по умолчанию true. Примеры см. в Многопозиционные токены.
flags
(Необязательно, строка) Список включенных операторов для синтаксиса простой строки поиска. По умолчанию ALL (все операторы). Допустимые значения см. в Ограничение операторов.
fuzzy_max_expansions
(Необязательно, целое число) Максимальное количество терминов, до которых запрос расширяется для приближенного совпадения. По умолчанию 50.
fuzzy_prefix_length
(Необязательно, целое число) Количество начальных символов, которые остаются неизменными при приближенном совпадении. По умолчанию 0.
fuzzy_transpositions
(Необязательно, логическое значение) Если true, правки для приближенного совпадения включают перестановки двух соседних символов (ab → ba). По умолчанию true.
lenient
(Необязательно, логическое значение) Если true, ошибки, основанные на формате, такие как предоставление текстового значения для поля типа числового поля, игнорируются. Значение по умолчанию false.
minimum_should_match
(Необязательно, строка) Минимальное количество клаузов, которые должны соответствовать для того, чтобы документ был возвращен. См. minimum_should_match параметр для допустимых значений и дополнительной информации.
quote_field_suffix

(Необязательно, строка) Суффикс, добавляемый к цитируемому тексту в строке запроса.

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

Примечания

Синтаксис простого запроса

Оператор simple_query_string поддерживает следующие операторы:

  • + обозначает операцию И
  • | обозначает операцию ИЛИ
  • - инвертирует один токен
  • " заключает несколько токенов в кавычки, чтобы обозначить фразу для поиска
  • * в конце термина обозначает запрос префикса
  • ( и ) обозначают приоритет
  • ~N после слова обозначает расстояние редактирования (неточность)
  • ~N после фразы обозначает значение смещения

Чтобы использовать один из этих символов буквально, экранируйте его предшествующей обратной косой чертой (\).

Поведение этих операторов может отличаться в зависимости от значения default_operator. Например:

resp = client.search(
    query={
        "simple_query_string": {
            "fields": [
                "content"
            ],
            "query": "foo bar -baz"
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      simple_query_string: {
        fields: [
          'content'
        ],
        query: 'foo bar -baz'
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    simple_query_string: {
      fields: ["content"],
      query: "foo bar -baz",
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "simple_query_string": {
      "fields": [ "content" ],
      "query": "foo bar -baz"
    }
  }
}

Этот поиск предназначен для возврата только документов, содержащих foo или bar, которые также не содержат baz. Однако из-за default_operator OR, этот поиск на самом деле возвращает документы, содержащие foo или bar, а также любые документы, не содержащие baz. Чтобы получить документы так, как предполагалось, измените строку запроса на foo bar +-baz.

Ограничительные операторы

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

Чтобы явно включить только определенные операторы, используйте разделитель |. Например, значение flags OR|AND|PREFIX отключает все операторы, кроме OR, AND и PREFIX.

resp = client.search(
    query={
        "simple_query_string": {
            "query": "foo | bar + baz*",
            "flags": "OR|AND|PREFIX"
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: 'foo | bar + baz*',
        flags: 'OR|AND|PREFIX'
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    simple_query_string: {
      query: "foo | bar + baz*",
      flags: "OR|AND|PREFIX",
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "simple_query_string": {
      "query": "foo | bar + baz*",
      "flags": "OR|AND|PREFIX"
    }
  }
}
Допустимые значения

Доступные флаги:

ALL (По умолчанию)
Включает все необязательные операторы.
AND
Включает оператор + И.
ESCAPE
Включает \ в качестве символа экранирования.
FUZZY
Включает оператор ~N после слова, где N — целое число, обозначающее разрешенное расстояние редактирования для сопоставления. См. Неточность.
NEAR
Включает оператор ~N после фразы, где N — максимальное количество допустимых позиций между соответствующими токенами. Синонимичен SLOP.
NONE
Отключает все операторы.
NOT
Включает оператор - НЕ.
OR
Включает оператор \| ИЛИ.
PHRASE
Включает оператор " кавычек, используемый для поиска фраз.
PRECEDENCE
Включает операторы ( и ) для управления приоритетом операторов.
PREFIX
Включает оператор * префикса.
SLOP
Включает оператор ~N после фразы, где N — максимальное количество допустимых позиций между соответствующими токенами. Синонимичен NEAR.
WHITESPACE
Включает пробелы в качестве символов разбиения.

Подстановочные знаки и повышения по полю в параметре fields

Поля могут быть указаны с подстановочными знаками, например:

resp = client.search(
    query={
        "simple_query_string": {
            "query": "Will Smith",
            "fields": [
                "title",
                "*_name"
            ]
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: 'Will Smith',
        fields: [
          'title',
          '*_name'
        ]
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    simple_query_string: {
      query: "Will Smith",
      fields: ["title", "*_name"],
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "simple_query_string" : {
      "query":    "Will Smith",
      "fields": [ "title", "*_name" ] 
    }
  }
}

Искать в полях title, first_name и last_name.

Отдельные поля могут быть усилены с помощью знака вставки (^):

resp = client.search(
    query={
        "simple_query_string": {
            "query": "this is a test",
            "fields": [
                "subject^3",
                "message"
            ]
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: 'this is a test',
        fields: [
          'subject^3',
          'message'
        ]
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    simple_query_string: {
      query: "this is a test",
      fields: ["subject^3", "message"],
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "simple_query_string" : {
      "query" : "this is a test",
      "fields" : [ "subject^3", "message" ] 
    }
  }
}

Поле subject имеет в три раза большую важность, чем поле message.

Токены в нескольких позициях

По умолчанию, анализатор запросов simple_query_string создает запрос match_phrase для каждого токена в нескольких позициях в строке запроса. Например, парсер создает запрос match_phrase для многословного синонима ny, new york:

(ny OR ("new york"))

Чтобы сопоставлять токены в нескольких позициях с конъюнкцией AND, установите значение auto_generate_synonyms_phrase_query в false:

resp = client.search(
    query={
        "simple_query_string": {
            "query": "ny city",
            "auto_generate_synonyms_phrase_query": False
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: 'ny city',
        auto_generate_synonyms_phrase_query: false
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    simple_query_string: {
      query: "ny city",
      auto_generate_synonyms_phrase_query: false,
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "simple_query_string": {
      "query": "ny city",
      "auto_generate_synonyms_phrase_query": false
    }
  }
}

Для данного примера парсер создает следующий запрос bool:

(ny OR (new AND york)) city)

Этот запрос bool соответствует документам с термином ny или конъюнкцией new AND york.

© 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/8.17/query-dsl-simple-query-string-query.html

Spec-Zone.ru

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