Elasticsearch не удалось проанализировать запрос, не удается проанализировать ‘ИЛИ’

#elasticsearch

#elasticsearch

Вопрос:

Я пытаюсь найти слово «ИЛИ» в документе из индекса.
Вот запрос, который я ввожу

 GET index_name/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "query_string": {
            "query": "OR word1",
            "fields": [
              "field1"
            ]
          }
        }
      ]
    }
  }
}
  

Я получаю следующую ошибку

 {
  "error": {
    "root_cause": [
      {
        "type": "query_shard_exception",
        "reason": "Failed to parse query [OR word1]",
        "index_uuid": "Brju2MNeQ5m7sI02Q2Y4gw",
        "index": "index_name"
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "index_name",
        "node": "C5Suw-gaR7eehoH0WNGw1A",
        "reason": {
          "type": "query_shard_exception",
          "reason": "Failed to parse query [OR word1]",
          "index_uuid": "Brju2MNeQ5m7sI02Q2Y4gw",
          "index": "index_name",
          "caused_by": {
            "type": "parse_exception",
            "reason": "Cannot parse 'OR word1': Encountered " <OR> "OR "" at line 1, column 0.nWas expecting one of:n    <NOT> ...n    " " ...n    "-" ...n    <BAREOPER> ...n    "(" ...n    "*" ...n    <QUOTED> ...n    <TERM> ...n    <PREFIXTERM> ...n    <WILDTERM> ...n    <REGEXPTERM> ...n    "[" ...n    "{" ...n    <NUMBER> ...n    <TERM> ...n    ",
            "caused_by": {
              "type": "parse_exception",
              "reason": "Encountered " <OR> "OR "" at line 1, column 0.nWas expecting one of:n    <NOT> ...n    " " ...n    "-" ...n    <BAREOPER> ...n    "(" ...n    "*" ...n    <QUOTED> ...n    <TERM> ...n    <PREFIXTERM> ...n    <WILDTERM> ...n    <REGEXPTERM> ...n    "[" ...n    "{" ...n    <NUMBER> ...n    <TERM> ...n    "
            }
          }
        }
      }
    ]
  },
  "status": 400
}
  

Почему это ошибка и каков правильный способ преодолеть это? Если я удалю слово «Или» из запроса, он будет работать нормально, однако, когда я сохраняю его, он выдает мне эту ошибку

Ответ №1:

Если я правильно понял вашу проблему, я создал индекс и проглотил два документа. Я попытался разработать предложение, используя escape символы = \

Вот данные, которые я проглотил:

«field1»: «word1»

«field1»: «ИЛИ word1»

Затем я внес небольшую модификацию в ваш запрос:

 {
    "query": {
        "bool": {
        "filter": [
            {
                "query_string": {
                    "query": "word1 \OR",
                    "fields": ["field1"]
                }
            }
            ]
        }
    }
}
  

Ответ был:

 "hits" : [
  {
    "_index" : "or-doc",
    "_type" : "_doc",
    "_id" : "9mCioHQBowpsxTkF3Jdx",
    "_score" : 0.0,
    "_source" : {
      "field1" : "word1"
    }
  },
  {
    "_index" : "or-doc",
    "_type" : "_doc",
    "_id" : "82CjoHQBowpsxTkFCZgE",
    "_score" : 0.0,
    "_source" : {
      "field1" : "OR word1"
    }
  }
]
  

Примечание: я избежал OR , поскольку он рассматривается как reserved words .

Я буду рад помочь, если у вас возникнут какие-либо проблемы.

Ссылки: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html

Ответ №2:

Не рекомендуется использовать query_string, как указано в официальной документации ES:

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

Если вам не нужно поддерживать синтаксис запроса, рассмотрите возможность использования запроса соответствия. Если вам нужны функции синтаксиса запроса, используйте запрос simple_query_string , который является менее строгим.

Поисковый запрос:

 {
  "query": {
    "match": {
      "title": {
        "query": "OR"
      }
    }
  }
}
  

Результат поиска:

 "hits": [
            {
                "_index": "stof_63952836",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.43445712,
                "_source": {
                    "title": "OR word1"
                }
            }
        ]