#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"
}
}
]