Не в состоянии написать запрос с подстановочными знаками для ElasticSearch?

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

Набор данных выглядит следующим образом в ES:

   "hits": {
      "total": 1000,
      "max_score": 1,
      "hits": [
         {
            "_index": "accounts",
            "_type": "data",
            "_id": "25",
            "_score": 1,
            "_source": {
               "account_number": 25,
               "balance": 40540,
               "firstname": "Virginia",
               "lastname": "Ayala",
               "age": 39,
               "gender": "F",
               "address": "171 Putnam Avenue",
               "employer": "Filodyne",
               "email": "[email protected]",
               "city": "Nicholson",
               "state": "PA"
            }
         }

И я использую следующий запрос:

GET /_search
{
    "query":{       
    "filtered" : {
      "filter" : {
        "bool" : {
          "should" :
          {
            "match":{
            "wildcard":{"lastname" : "Aya*" }
            }
          }      
        }
      }
    }
    }
}

Но выдает следующую ошибку:

{
   "error": {
      "root_cause": [
         {
            "type": "query_parsing_exception",
            "reason": "[match] query does not support [lastname]",
            "index": "accounts",
            "line": 9,
            "col": 25
         }

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

Без запроса на совпадение:

GET /_search
{
    "query":{       
    "filtered" : {
      "filter" : {
        "bool" : {
          "should" :
          {
            "wildcard":{"lastname" : "Aya*" }
          }      
        }
      }
    }
    }
}

Пожалуйста, помогите мне понять, как я должен подготовить запрос. Я должен использовать эту строку запроса в JAVA API, а также. Таким образом, любой совет по этому вопросу также будет очень полезным.

2 ответа

Решение

Я угадываю твои lastname поле, вероятно, analyzed и, таким образом, токен, который был проиндексирован, ayala и не Ayala, Так как wildcard запросы не анализируются, необходимо указать поисковый запрос в нижнем регистре:

Попробуй это:

POST /_search
{
    "query":{       
    "filtered" : {
      "filter" : {
        "bool" : {
          "should" :
          {
            "wildcard":{"lastname" : "aya*" }
          }      
        }
      }
    }
    }
}

Это сработало для меня:

GET /_search
{
  "query": {
    "wildcard": {
      "lastname": "aya*"
    }
  }
}

Я потратил много времени на это, пока не прочитал это онлайн:

...if you search a not_analyzed field and use wildcards, you MUST NOT include any capital letters in your query...

Все время это не работало, потому что я искал, например, Aya*, Как только я перевел его в нижний регистр aya* это сработало.

Другие вопросы по тегам