#elasticsearch #elastic-stack
Вопрос:
Как я экранирую символы Юникода с помощью запроса query_string? Например, мои документы состоят из следующих данных:
{
"title":"Sachin$tendular"
}
Я использую запрос query_string следующим образом:
{
"query": {
"query_string": {
"fields": ["title"],
"query": "*Sachin$*"
}
}
}
но это не дает мне никакого результата, и если я удалил $ из запроса, это работает
ИТАК, как мы можем справиться с $ здесь?
Привет, мое сопоставление полей заголовка
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
}
Когда я использую запрос типа
[{
"query_string": {
"query": "*character*",
"fields": ["title.raw"],
"default_operator": "OR"
}
}]
Это работает, но когда я использую запрос типа
[{
"query_string": {
"query": "*Special character*",
"fields": ["title.raw"],
"default_operator": "OR"
}
}]
это не работает, но
[{
"query_string": {
"query": "*Special character*",
"fields": ["title"],
"default_operator": "OR"
}
}]
это работает, и мои данные о названии выглядят так:
Special character test ! @ # $ % ^ amp; * ( ) _ - = { } [ ] | \ ; : " ' < > , . / ? ~ ` ₹
ИТАК, как я могу получить весь результат комбинации здесь, используя один запрос? и когда следует использовать название и название.сырой здесь
Ответ №1:
Предполагая, что title
поле имеет text
тип, поэтому elasticsearch использует стандартный анализатор, если для text
поля типа не определен анализатор. Sachin$tendular
получает маркировку на
{
"tokens": [
{
"token": "sachin",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "tendular",
"start_offset": 7,
"end_offset": 15,
"type": "<ALPHANUM>",
"position": 1
}
]
}
Вы можете использовать строку запроса в title.keyword
поле, если вы используете сопоставление по умолчанию. При этом будет использоваться анализатор ключевых слов вместо стандартного анализатора. В противном случае измените тип данных title
поля на тип keyword
{
"query": {
"query_string": {
"fields": ["title.keyword"],
"query": "*Sachin$*"
}
}
}
В противном случае вы можете обновить сопоставление полей, использовать несколько полей для title
поля, как показано в документации.
Обновление 1:
Вместо этого вы можете использовать запрос с подстановочными знаками для поиска выражения с подстановочными знаками с пробелами
{
"query": {
"wildcard": {
"title.keyword": {
"value": "*Special character*"
}
}
}
}
Комментарии:
1. спасибо, как мы можем использовать это во вложенных полях?
2. @SurajDalvi о каких вложенных полях вы спрашиваете ?
3. обновите вопрос с сопоставлением полей заголовка, пожалуйста, проверьте его и дайте мне знать
4. в принципе, я хочу использовать здесь запрос contain. Означает, что мне нужны те названия, которые содержат заданное значение. либо полная стоимость, либо частичная стоимость
5. @SurajDalvi обновил ответ, пожалуйста, просмотрите обновленную часть и дайте мне знать, решит ли это вашу проблему ?