Как сделать точную фразу query_string в ElasticSearch

Я положил 2 документа в Elasticsearch:

curl -XPUT "http://localhost:9200/vehicles/vehicle/1" -d'
{
    "model": "Classe A"
}'

curl -XPUT "http://localhost:9200/vehicles/vehicle/2" -d'
{
    "model": "Classe B"
}'

Почему этот запрос возвращает два документа:

curl -XPOST "http://localhost:9200/vehicles/_search" -d'
{
  "query": {
    "query_string": {
      "query": "model:\"Classe A\""
    }
  }
}'

И этот, только второй документ:

curl -XPOST "http://localhost:9200/vehicles/_search" -d'
{
  "query": {
    "query_string": {
      "query": "model:\"Classe B\""
    }
  }
}'

Я хочу, чтобы эластичный поиск соответствовал точной фразе, передаваемой параметру запроса, с пробелом, как я могу это сделать?

Ответ 1

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

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

Если вы хотите совместить целую строку "Classe A" и отличить ее от "Classe B", вы можете использовать анализатор ключевых слов. Это сохранит все поле как одну строку.

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

Создайте сопоставление:

PUT vehicles
{
  "mappings": {
    "vehicle": {
      "properties": {
        "model": {
          "type": "string",
          "analyzer": "keyword"
        }
      }
    }
  }
}

Выполните запрос:

POST vehicles/_search
{
  "query": {
    "match": {
      "model": "Classe A"
    }
  }
}

Если вы хотите использовать запрос query_string, тогда вы можете установить оператор AND

POST vehicles/vehicle/_search
{
  "query": {
    "query_string": {
      "query": "Classe B",
      "default_operator": "AND"
    }
  }
}

Ответ 2

Кроме того, вы можете использовать query_string и избегать кавычек, а также возвращать точную фразу:

POST _search
{
    "query": {
      "query_string": {
        "query": "\"Classe A\""
     }
}

Ответ 3

используйте запрос соответствия фразы, как указано ниже

GET /company/employee/_search   
{     
    "query" : {      
        "match_phrase" : {      
            "about" : "rock climbing"      
        }      
    }      
}