Похоже, сопоставления Elasticsearch не применяются для запроса - PullRequest
0 голосов
/ 25 января 2019

Я использую Elasticsearch с приложением Spring Boot.В этом приложении у меня есть индекс customer, а клиент содержит поле secretKey.Этот секретный ключ представляет собой строку, составленную из цифр и букв, следующим образом FOOBAR-000

Моя цель состояла в том, чтобы выбрать по одному секретному ключу ровно одного клиента, поэтому я изменил сопоставления на НЕ анализировать эти поля, но, похоже, неРабота.Что я делаю не так?

Вот мое отображение

curl -X GET 'http://localhost:9200/customer/_mapping'
 {
        "customer": {
            "mappings": {
                "customer": {
                    "properties": {
                        "secretKey": {
                            "type": "string",
                            "index": "not_analyzed"
                        }
                    }
                }
            }
        }
    }

, но после того, как я выполню запрос

curl -XGET "http:/localhost:9200/customer/_validate/query?explain" -d'
{
    "query": {
        "query_string": {
        "query": "FOOBAR-3121"
    }
   }
}'

, я получаю следующее объяснение:

"explanations": [
        {
            "index": "customer",
            "valid": true,
            "explanation": "_all:foobar _all:3121"
        },
    ]

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Вам необходимо указать имя поля в запросе, без него ElasticSearch выполняет запрос ко всем полям, поэтому вы видите _all.Попробуйте это:

curl -XGET "http:/localhost:9200/customer/_validate/query?explain" -d'
{
  "query": {
    "term": {
      "secretKey": {
        "value": "FOOBAR-3121"
      }
    }
  }
}'
0 голосов
/ 31 января 2019

Моя цель состояла в том, чтобы выбрать именно одного клиента по его секретному ключу

Ваше требование строгое, поэтому используйте запрос MATCH для выбора ТОЛЬКО соответствующего клиента!

curl -XGET "http:/localhost:9200/customer/_validate/query?explain" -d'
{
  "query": {
      "match": {
          "secretKey": "FOOBAR-3121"
     }
 }
0 голосов
/ 25 января 2019

Насколько я понимаю, у вас есть индекс " customer ", а внутри этого индекса - документ, содержащий поле " customer ". В вашем случае secretKey должен быть вложен в " customer". По некоторым причинам Elasticsearch решил вести себя странно, если вы инкапсулируете объекты, не указывая, что они имеют вложенный тип. Это статья из документа, которая подробно объясняет поведение. Если вы укажете это со следующим:

{
    "customer": {
        "mappings": {
            "_doc": {
              "properties": {
                  "customer": {
                     "type": "nested" 
                   }
              }
            }  
        }
    }
}

Тогда он должен работать с вашим запросом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...