Специальный символ ElasticSearch escape

#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 обновил ответ, пожалуйста, просмотрите обновленную часть и дайте мне знать, решит ли это вашу проблему ?